在不改变其他嵌入字符串的情况下替换字符串

Substitute String without altering other embedded strings

我有以下数据框

df <- data.frame(c(1, 2, 3, 4), c("T-A1", "T-A1-2", "T-A1-3", "T-A1-4"), c("apple", "banana", "pear", "orange"))
names(df) <- c("num", "name", "fruit")

  num   name  fruit
1   1   T-A1  apple
2   2 T-A1-2 banana
3   3 T-A1-3   pear
4   4 T-A1-4 orange

我需要将 "T-A1" 更改为 "T-A1-1"

num   name  fruit        num   name  fruit
1   1 T-A1   apple       1   1 T-A1-1 apple
2   2 T-A1-2 banana   -> 2   2 T-A1-2 banana
3   3 T-A1-3 pear        3   3 T-A1-3 pear
4   4 T-A1-4 orange      4   4 T-A1-4 orange

我用过这个功能:

df$name <- gsub("T-A1", "T-A1-1", df$name)

但是我得到的结果是这个:

  num   name   fruit
1   1 T-A1-1   apple
2   2 T-A1-1-2 banana
3   3 T-A1-1-3 pear
4   4 T-A1-1-4 orange

然后我尝试了这个公式:

df$name <- gsub("T-A1", "T-A1-1", df$name, fixed = TRUE)

但我仍然得到与前面提到的相同的结果。

最理想的情况是当它只有 "T-A1" 时能够替换 "T-A1",无论是否嵌套在任何其他单词中,无论是在开头、中间还是结尾。

换句话说,如果某些条目看起来像这样 "T-A1-word"、"word-T-A1" 或 "wo-T-A1-rd",它们应该仍然不会受到影响,并且它们的 "T-A1" 部分会仍然完好无损。我唯一想替换 "T-A1" 的时候是它本身就是 "T-A1" 的时候。

R version 3.4.1 Winodws 7 64 bit

您需要告诉 gsub T-A1 正是您要查找的字符串。

df$name <- gsub("^T-A1$", "T-A1-1", df$name)

##   num   name  fruit
## 1   1 T-A1-1  apple
## 2   2 T-A1-2 banana
## 3   3 T-A1-3   pear
## 4   4 T-A1-4 orange

这是有效的,因为 $ 告诉 gsub T-A1 应该出现在字符串的最后,而 ^ 告诉它应该是它的开头.取决于您的实际数据集,您可能需要使用不同的 表达式。

这个regex-faq可以给你一些想法。