2015-04-29 54 views
16

我试图在数据帧df在河改名因素column1水平A的因素之一级我目前的做法是这样的:重命名中的R

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

不抛出任何错误或警告,但完全无效。

B是不是已经存在的水平(从试验和错误我开始怀疑是很重要的),所以下面,我第一次尝试,没有工作,要么

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

任何人都可以引导我正确的方法?

回答

20

我要建议

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

或使用效用函数plyr::revalue

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

transform()是少许白糖,这不是必要;你可以使用df$column1 <- revalue(df$column1(...))

为了完整,car::recode也适用,但我觉得有点笨重即plyr::revalue(因为重新编码被指定为带引号的字符串)。

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

这是我能想到的最好的。这是R的索引实际上并不十分整齐的情况之一。 – thelatemail

+0

谢谢!第一个选项完美运作。 – user3949312

5

一种方法就是改变关卡的标签。首先,一些测试数据

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

,现在我们将 “A” 与 “X”

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

,我们可以看到,它的改变

column1 
1  X 
2  B 
3  C 
4  X 
5  B 

你可能要小心与gsub(),因为它接受一个正则表达式。更具体的更换将

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

精确匹配 “A”,而不是 “CAB” 或别的东西与资本A.

+2

'gsub'在这里有点危险。如果您的级别是“A”和“Ajax”,该怎么办? – thelatemail

+0

@thelatemail我正在编辑您所评论的内容。 – MrFlick