代码之家  ›  专栏  ›  技术社区  ›  Shawn Janzen

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

  •  2
  • Shawn Janzen  · 技术社区  · 7 年前

    我在R中使用sub()和gsub()函数重命名/更改R中的因子级别时遇到了一个小问题。但我不确定为什么它不起作用。

    我有一些调查数据,其中几个因素的水平截断了高值。例如,关于你上周工作了多少小时的问题在“89+小时”处停止。我想把这个级别改为“89”,这样我就可以在其他活动中使用它。

    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
    

    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
    

    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 
    

    但是,当我试图将带有+符号的级别重命名/更改为不带+符号的级别时,我陷入了困境:

    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
    

    如果我用*而不是a+,这个问题也会发生,但是如果它是点(.)而不是a+,这个问题也会发生。所以我认为这与某些特殊角色有关,而与其他角色无关。

    提前谢谢!

    2 回复  |  直到 7 年前
        1
  •  3
  •   MrFlick    7 年前

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

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

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

    分() 适用于任何字符向量,以及 levels() 恰好返回一个字符向量。

        2
  •  2
  •   akrun    7 年前

    一个方便的选择是 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"))