如何使用 R 中的子函数更改具有加号 (+) 的因子水平?

How can I use a sub function in R to change a factor level that has a plus (+ ) symbol?

我 运行 使用 R 中的 sub() 和 gsub() 函数到 rename/change R 中的一个因子水平。但我不确定为什么它不起作用。

场景: 我有一些调查数据,其中有几个因素的水平会截断高值。例如,关于您上周工作了多少小时的问题在“89 + 小时”处停止。我想将此级别更改为“89”,以便我可以将其数字化地用于其他活动。 我知道几种方法来做到这一点——所以我不需要各种其他级别更改选项。

我按照说明使用此站点的 sub() 和 gsub() 函数:http://www.cookbook-r.com/Manipulating_data/Renaming_levels_of_a_factor/ 概念清晰明了。

这是初始示例数据:

x <- factor(c("a", "b", "c", "d"))
x
[1] a b c d
Levels: a b c d

我可以把d级改成89级

x <- factor(c("a", "b", "c", "d"))
levels(x) <- sub("d", "89", levels(x))
x
[1] a b c 89
Levels: a b c 89

我在关卡里引入一个space就好了:

x <- factor(c("a", "b", "c", "d"))
levels(x) <- sub("d", "89 hrs", levels(x))
x
[1] a b c 89 hrs
Levels: a b c 89 hrs

当我在新的因子水平中引入+符号时我没问题:

x <- factor(c("a", "b", "c", "d"))
levels(x) <- sub("d", "89+ hrs", levels(x))
x
[1] a b c 89+ hrs
Levels: a b c 89+ hrs 

但是当我试图 rename/change 有 + 符号的关卡变成没有它的关卡时,我卡住了:

x <- factor(c("a", "b", "c", "89+ hrs"))
x
[1] a b c 89+ hrs
Levels:89+ hrs a b c

levels(x) <- sub("89+ hrs", "d", levels(x))
x
[1] a b c 89+ hrs
Levels: 89+ hrs a b c

当我包含来自链接站点的特定字符串示例时出现同样的问题:

levels(x) <- sub("^89+ hrs$", "d", levels(x))
x
[1] a b c 89+ hrs
Levels: 89+ hrs a b c

如果我使用 gsub() 而不是 sub() 也会遇到同样的问题。

如果我使用 * 而不是 +,也会出现此问题,但如果它是点 (.) 而不是 +,则该问题会发生。所以我认为它与某些特殊字符有关,但与其他字符无关。

知道为什么这不适用于 + 符号以及我如何使用这些功能吗? 提前致谢!

sub()函数默认使用正则表达式,+是正则表达式的特殊字符。如果要匹配文字加号,请使用

levels(x) <- sub("89\+ hrs", "d", levels(x))

levels(x) <- sub("89+ hrs", "d", levels(x), fixed=TRUE)

没有什么是真正独特的因素。这就是 sub() 与任何字符向量一起工作的方式,而 levels() 恰好 return 一个字符向量。

一个方便的选项是 fct_recode 来自 forcats

library(forcats)
fct_recode(x, d = "89+ hrs")
#[1] a b c d
#Levels: d a b c

数据

x <- factor(c("a", "b", "c", "89+ hrs"))