如果列不包含,则为列的每一行添加前缀

时间:2017-09-21 14:20:33

标签: r regex dataframe apply

我有一个数据框dt:

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

现在我想为每个&#39;值添加前缀_&#39;不以_开头,因此结果数据框应为

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

我知道我可以使用substr函数来检查一个值是否以_开头,但我不想用循环来做。我想使用apply函数。我该怎么办?顺便说一句,我是新申请职能的。

---编辑:感谢所有人的解决方案。对不起,但我过度简化了我的真实情况。在我的实际情况中,我必须将前缀_添加到不以&amp ;,不同符号开头的值。 ---编辑2:只是意识到它是一样的。以下将做

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

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

虚拟解决方案,但有效......将{strong>每个字符串的开头替换为_,如果有两个___)则返回一个

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

答案 2 :(得分:1)

另一种选择......

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

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

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