重命名R中的一个因子级别

per*_*urd 17 r r-factor

我正在尝试重命名R 中数据框中A的因子级别.我目前的方法是这样的:column1df

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

它不会引发任何错误或警告但完全无效.

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

df[!is.na(df$column1) & df$column1 == 'A', 'column1'] <- 'B'
Run Code Online (Sandbox Code Playgroud)

任何人都可以指导我采取正确的方法吗?

Ben*_*ker 21

我打算建议

levels(df$column1)[levels(df$column1)=="A"] <- "B"
Run Code Online (Sandbox Code Playgroud)

或使用效用函数plyr::revalue:

library("plyr")
df <- transform(df,
          column1=revalue(column1,c("A"="B")))
Run Code Online (Sandbox Code Playgroud)

transform()是一点点糖,没有必要; 你可以用df$column1 <- revalue(df$column1(...))

为了完整性,car::recode也可以工作,虽然我发现它有点笨拙plyr::revalue(因为重新编码被指定为带引号的字符串).

car::recode(df$column1,"'A'='B'")
Run Code Online (Sandbox Code Playgroud)


MrF*_*ick 6

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

df <- data.frame(column1=c("A","B","C","A","B"))
Run Code Online (Sandbox Code Playgroud)

现在我们将"A"替换为"X"

levels(df$column1) <- gsub("A","X", levels(df$column1))
Run Code Online (Sandbox Code Playgroud)

我们可以看到它已经改变了

  column1
1       X
2       B
3       C
4       X
5       B
Run Code Online (Sandbox Code Playgroud)

您可能需要小心,gsub()因为它接受正则表达式.更具体的替代品将是

gsub("^A$","X", levels(df$column1))
Run Code Online (Sandbox Code Playgroud)

完全匹配"A"而不是"CAB"或其他与大写字母A.

  • `gsub`在这里有点风险.如果你有级别"A"和"Ajax"怎么办? (2认同)