Jak zmienić nazwy kolumn w ramce danych w R? [Zamknięte]

9
 names(mydat)[c(name)]<-c("newname") 

Z tego wiem, że nazwa kolumny / zmiennej „name” ramki danych mydat jest zastąpiona przez „newname”.

Moje pytanie brzmi: czy chcę to zrobić za pomocą pętli, aby uzyskać coś takiego:

newname1 newname2 newname3 newname4 i tak dalej, jak to zrobić?

Oto, co zadziałało i nie zadziałało:

for(i in 1:4){
names(mydat)[c(name)]<-c("newname"i)
}

Czy istnieje sposób, aby to zakodować? wielkie dzięki dla wszystkich, którzy mogliby pomóc. Owusu Isaac

Syn
źródło
4
To pytanie wydaje się nie na temat, ponieważ dotyczy wyłącznie programowania.
gung - Przywróć Monikę
Jeśli chcesz zmienić nazwę niektórych brzydkich nazw zmiennych (np. Abcde_1_1, abcde_2_2, abcde_3_3 ...), jak to często zdarza się w niektórych zestawach danych pobranych z Qualtrics: ugly_vars <- names(dplyr::select(df, starts_with("abcde_"))) names(ESM_df[ugly_vars]) <- str_c("abc_", 1:length(ugly_vars))
JetLag

Odpowiedzi:

10

Najbardziej oczywistym rozwiązaniem byłaby zmiana kodu w pętli for za pomocą:

   names(mydat)[c(name)] <- paste("newname",i,sep="")

Ale musisz wyjaśnić, jaka jest twoja zmienna name. W tej chwili ta pętla wykona 4 nazwy jednej kolumny.

Ogólnie rzecz biorąc, jeśli nazwy, które chcesz zmienić, znajdują się w wektorze, jest to standardowa procedura podzestawu:

 names(mydat)[names(mydat)%in% names_to_be_changed] <- name_changes
mpiktas
źródło
Witaj Mpiktas, Twoje rozwiązanie działa doskonale. Wielkie dzięki. i dzięki również wszystkim
Syn
1
@Owusu, wyrazem wdzięczności na tej stronie jest poprawa odpowiedzi i ich akceptacja. Zobacz nas . Tak czy inaczej, cieszę się, że mogę być pomocny.
mpiktas
6

Spróbuj użyć sprintflub paste:

names(mydat)<-sprintf("name%d",1:10)

Zauważ też, że names(mydat)[c(name)]jest to mniej nonsens; c(name)jest równoważne z zapisem just namei oznacza „pobierz wartość zmiennej o nazwie name”; nawias przynajmniej wyodrębni elementy, names(mydat)ale tylko wtedy, gdy namezmienna zawiera indeks liczbowy lub logiczny.

Jeśli chcesz wymienić kolumny zwane namez name1, name2, ..., nameNużyć coś takiego:

names(mydat)[names(mydat)=="name"]<-sprintf("name%d",1:sum(names(mydat)=="name"))

EDYCJA: Cóż, jeśli chcesz po prostu usunąć zduplikowane nazwy kolumn, istnieje jeszcze łatwiejszy sposób; R ma make.namesfunkcję, która rozwiązuje ten problem; można go użyć w następujący sposób:

names(mydat)<-make.names(names(mydat),unique=TRUE)

Jeszcze krócej, to samo można uzyskać tylko pisząc:

data.frame(mydat)->mydat #The magic is in check.names, but it is TRUE by default

źródło
@mbq, == czy częściowe dopasowanie ciągów?
mpiktas
@mpiktas Nie, ale potrzebne jest tylko dokładne dopasowanie. greplbyłoby bardziej odpowiednie do wykonywania bardziej ogólnej pracy.
@mbq, tak, ale zakłada się, że istnieje wiele kolumn o tej samej nazwie. R na to pozwala, ale staram się unikać korzystania z tej funkcji.
mpiktas
@mpiktas Najwyraźniej robi to OP, więc to pytanie.
@mbq dzięki za wyjaśnienie pomyłki z nazwami (mydat) [c (nazwa)] Od czasu napisania OP wiem, że nazwa kolumny / zmiennej „nazwa” przypominała „wow, czy to możliwe?” i próbowałem uzyskać dostęp do nazwisk po imieniu ... głupi ja;). Czy mogę pokornie zasugerować edycję pytania?
steffen
5

Miałem ten sam problem i rozwiązałem go za pomocą tego kodu:

names(mydat) <- paste("newname", 1:ncol(mydat), sep="");
cuong
źródło