2015-04-29 23 views
16

mam próby zmiany nazwy poziom A czynnika column1 w dataframe df w R. Moje obecne podejście jest takie:Zmień nazwę jednego poziomu czynnika R

levels(df[!is.na(df$column1) & df$column1 == 'A',]) <- 'B' 

który nie rzucać żadnych błędów lub ostrzeżenia, ale jest całkowicie nieskuteczne.

B nie jest już istniejący poziom (co z prób i błędów doszedłem do podejrzeń było ważne), więc dodaje, moja pierwsza próba nie działa albo

df[!is.na(df$column1) & df$column1 == 'A', 'column1'] <- 'B' 

Czy ktoś poprowadzi mnie do właściwe podejście?

Odpowiedz

20

miałem zamiar zaproponować

levels(df$column1)[levels(df$column1)=="A"] <- "B" 

lub wykorzystanie funkcja użyteczności plyr::revalue:

library("plyr") 
df <- transform(df, 
      column1=revalue(column1,c("A"="B"))) 

transform() jest trochę cukru, który nie jest niezbędny; można użyć df$column1 <- revalue(df$column1(...))

Dla kompletności car::recode też działa, chociaż uważam go trochę clunkier że plyr::revalue (bo Taśma jest określona jako cudzysłowie).

car::recode(df$column1,"'A'='B'") 
+0

To najlepsze, co mogłem wymyślić. Jest to jedna z tych sytuacji, w których indeksowanie R naprawdę nie jest zadowalające. – thelatemail

+0

Dziękujemy! Pierwsza opcja działała idealnie. – user3949312

5

Jednym ze sposobów byłoby po prostu zmiana etykiety poziomu. Po pierwsze, niektóre dane testowe

df <- data.frame(column1=c("A","B","C","A","B")) 

i teraz możemy zastąpić "A" z "X"

levels(df$column1) <- gsub("A","X", levels(df$column1)) 

i widzimy, że to się zmieniło

column1 
1  X 
2  B 
3  C 
4  X 
5  B 

Być może trzeba być ostrożnym z gsub(), ponieważ akceptuje wyrażenie regularne. Bardziej specyficzne wymiana byłaby

gsub("^A$","X", levels(df$column1)) 

dopasować dokładnie "A", a nie "cab" lub coś innego przez duże A.

+2

'gsub' jest tu nieco ryzykowny. Co jeśli masz poziomy "A" i "Ajax"? – thelatemail

+0

@thelatemail robiłem tę zmianę, skomentowałeś. – MrFlick