重命名 R 中因子的一个水平

问题描述 投票:0回答:2

我正在尝试重命名 R 中数据帧

A
中因子
column1
的级别
df
。我当前的方法是这样的:

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

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

B
不是一个已经存在的级别(通过反复试验,我开始怀疑它很重要),所以以下,我的第一次尝试,也不起作用

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

有人可以指导我正确的方法吗?

r r-factor
2个回答
28
投票

我正想建议

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'")

最近

forcats::fct_recode()
也可以用于此目的。


7
投票

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

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

现在我们用“X”替换“A”

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 的内容。

© www.soinside.com 2019 - 2024. All rights reserved.