2015-04-29 15 views
16

Sto tentando di rinominare il livello A del fattore column1 nel dataframe df in R. Il mio approccio attuale è questa:Rinominare un livello di un fattore di R

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

che non genera errori o avvisi, ma è completamente inefficace.

B non è un livello già esistente (che da tentativi ed errori sono venuto a sospettare era importante), in modo che la segue, il mio primo tentativo, non ha funzionato neanche

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

Qualcuno potrebbe mi guida per l'approccio corretto?

risposta

20

Stavo per suggerire

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

o l'uso la funzione di utilità plyr::revalue:

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

transform() è un po 'di zucchero che non è necessario; è possibile utilizzare df$column1 <- revalue(df$column1(...))

Per completezza, car::recode funziona anche, anche se trovo un po 'più clamoroso quello plyr::revalue (perché la ricodifica è specificata come stringa quotata).

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

È il massimo che potrei inventare. Questo è uno di quei casi in cui l'indicizzazione di R non è davvero molto accurata. – thelatemail

+0

Grazie! La prima opzione ha funzionato perfettamente. – user3949312

5

Un modo sarebbe solo per cambiare l'etichetta del livello. In primo luogo, alcuni dati di prova

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

e ora abbiamo sostituire "A" con "X"

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

e possiamo vedere che è cambiato

column1 
1  X 
2  B 
3  C 
4  X 
5  B 

Potrebbe essere necessario stare attenti con gsub() poiché accetta un'espressione regolare. Una sostituzione più specifica sarebbe

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

corrispondere esattamente "A" e non "CAB" o qualcos'altro con un capitale A.

+2

'gsub' è un po 'rischioso qui. E se avessi i livelli "A" e "Ajax"? – thelatemail

+0

@thelatemail stavo facendo quella modifica mentre commentavi. – MrFlick