【问题标题】:Add prefix to every row of a column if it doesn't contain it如果列中不包含前缀,则为每一行添加前缀
【发布时间】:2017-09-21 14:20:32
【问题描述】:

我有一个数据框 dt:

dt <- data.frame(id=c(1,2,3),value=c("a","_b","c"))

现在我想为每个不以_开头的“值”添加前缀_,所以生成的数据框应该是

id, value
1,  _a
2,  _b
3,  _c

我知道我可以使用 substr 函数来检查一个值是否以 _ 开头,但我不想用循环来做。我想使用应用功能。我该如何进行?顺便说一句,我是新来应用函数的。

---编辑:感谢大家的解决方案。对不起,但我过度简化了我的真实案例。在我的真实情况下,我必须将前缀 _ 添加到不以 & 开头的值,不同的符号。 ---Edit2:只要意识到它是一样的。以下会做

dt$value <- gsub("^([^&].*)", "_\\1", dt$value)

【问题讨论】:

    标签: r regex dataframe apply


    【解决方案1】:

    另一种选择...

    dt$value <- gsub("^([^_].*)", "_\\1", dt$value)
    
    dt
      id value
    1  1    _a
    2  2    _b
    3  3    _c
    

    第一个正则表达式查找字符串的开头,后跟不是_ 的字符串以及任何后续字符,并将其替换为第二个正则表达式,即_ 加上第一个正则表达式的捕获组。

    【讨论】:

      【解决方案2】:

      我们可以使用sub从字符串的开头(^)匹配不是_[^_])的字符,将其捕获为一个组((...))并将其替换为_ 后跟捕获组的反向引用 (\\1)

      levels(dt$value) <- sub("^([^_])", "_\\1", levels(dt$value))
      dt$value
      #[1] _a _b _c
      #Levels: _b _a _c
      

      【讨论】:

        【解决方案3】:

        虚拟解决方案,但有效...用_ 替换每个 字符串的开头,如果有两个_ (__),则只返回一个。

        dt$value <- sub("__", "_", sub("^", "_", dt$value))
        dt$value
        #[1] "_a" "_b" "_c"
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-03-07
          • 2022-08-18
          • 1970-01-01
          • 2020-05-06
          • 1970-01-01
          • 1970-01-01
          • 2013-11-18
          相关资源
          最近更新 更多