2015-04-29 13 views
16

Ich bin versucht, das Niveau A von Faktor column1 im Datenrahmen df in R. Mein aktueller Ansatz ist dies zu umbenennen:Umbenennen einer Ebene eines Faktors in R

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

, die werfen keine Fehler oder Warnungen aber ist völlig ineffektiv.

B ist nicht eine bereits vorhandene Ebene (die von Versuch und Irrtum kam ich war wichtig, zu vermuten), so dass die folgenden, mein erster Versuch, hat nicht funktioniert entweder

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

Könnte jemand mich leiten zu der richtige Ansatz?

Antwort

20

I

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

oder Verwendung vorschlagen würde die Nutzenfunktion plyr::revalue:

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

transform() ist ein wenig Zucker, der nicht notwendig; Sie könnten df$column1 <- revalue(df$column1(...))

verwenden

Der Vollständigkeit halber funktioniert car::recode auch, obwohl ich finde es ein bisschen klunker, dass plyr::revalue (weil die Umcodierung als String in Anführungszeichen angegeben ist).

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

Das ist das Beste, was ich mir vorstellen kann. Dies ist einer der Fälle, in denen die Indexierung von R wirklich nicht sehr ordentlich ist. – thelatemail

+0

Danke! Die erste Option hat perfekt funktioniert. – user3949312

5

Ein Weg wäre, nur die Bezeichnung des Levels zu ändern. Zunächst einige Testdaten

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

und jetzt ersetzen wir "A" mit "X"

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

und wir können sehen, dass es

column1 
1  X 
2  B 
3  C 
4  X 
5  B 

geändert hat Möglicherweise müssen vorsichtig sein, mit gsub(), da es einen regulären Ausdruck akzeptiert. Ein spezifischere Ersatz wäre

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

genau "A" entsprechen und nicht "CAB" oder etwas anderes mit einem Kapital A.

+2

'gsub' ist ein bisschen riskant hier. Was wäre wenn du die Level "A" und "Ajax" hättest? – thelatemail

+0

@thelatemail Ich habe diese Änderung gemacht, als du kommentiert hast. – MrFlick