【问题标题】:Rename one level of a factor in R在 R 中重命名因子的一个级别
【发布时间】:2015-04-29 00:58:36
【问题描述】:

我正在尝试重命名 R 中数据框 df 中因子 column1 的级别 A。我目前的方法是:

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

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

B 不是一个已经存在的级别(通过反复试验,我怀疑这很重要),所以以下,我的第一次尝试,也没有工作

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

谁能指导我正确的方法?

【问题讨论】:

    标签: r r-factor


    【解决方案1】:

    我打算建议

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

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

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

    transform() 是一点不必要的糖;你可以使用df$column1 &lt;- revalue(df$column1(...))

    为了完整起见,car::recode 也可以使用,尽管我发现它比plyr::revalue 有点笨拙(因为重新编码被指定为带引号的字符串)。

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

    【讨论】:

    • 这也是我能想到的最好的了。这是 R 的索引确实不是很整洁的实例之一。
    【解决方案2】:

    一种方法是更改​​关卡的标签。一、一些测试数据

    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。

    【讨论】:

    • gsub 在这里有点冒险。如果你有“A”和“Ajax”级别怎么办?
    • @thelatemail 我正在按照您的评论进行编辑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    • 2016-04-13
    • 1970-01-01
    • 1970-01-01
    • 2014-04-12
    相关资源
    最近更新 更多