将基于机器的行突变为通用的用户定义字符串

Mutate rows based on maching to user defined strings that works universally

我有这样的数据

 clas=c("CD_1","X.2_2","K_3","12k3_4",".A_5","xy_6")
 df <- data.frame(clas)
> df
    clas
1   CD_1
2  X.2_2
3  K_3
4 12k3_4
5   .A_5
6   xy_6

我想更改一些符合此条件的行

如果 _ 之后的字符串是 4,5 和 6,则将 _ 之前的字符串替换为字符串 B。所以输出应该是这样的;

    clas
1   CD_1
2  X.2_2
3  K_3
4 12kB_4
5   .B_5
6   xB_6

谢谢!

编辑::

所以如果我有这样的数据:

    clas
1   CD_1
2  X.2_2
3  K_3
4 12k3_4
5   .A_5
6  xy_11

然后应用您的解决方案,

df %>% mutate(clas = str_replace(clas, "(.)(_[4511])", "B\2"))

    clas
1   CB_1
2  X.2_2
3  K_3
4 12kB_4
5   .B_5
6  xB_11

但我只想匹配 11 而不是 1。我们该怎么做?

library(dplyr)
library(stringr)

clas <- c("CD_1","X.2_2","K_3","12k3_4",".A_5","xy_6")
df <- data.frame(clas)

df %>% mutate(clas = str_replace(clas, "(.)(_[456])", "B\2"))

此处放置匹配模式会创建一个包含 3 组的匹配,第一个包含整个表达式匹配 ._[456],第二个包含 . 部分,第三个包含 _[456]部分。

\2 访问第三组(0 索引),因此您将整个模式 ._[456] 替换为 B 后跟任何匹配的 _[456] 其中 [456] 是匹配括号内任何选项的字符。

编辑:

[] 中的每个字符都被单独处理,因此 [1111][1] 没有区别,因为该模式仅匹配单个字符,即 1 或 1 或 1或 1. 相反,您需要使用 |,所以您有 (.)(_[45]|_11)。这匹配第二个模式组中的 _4_5_11。此外,如果您想匹配 1-9 而不是 11 或 15,则需要使用 (.)(_[45])$,其中 $ 是字符串结束指示符。查看备忘单并在 RegExr.

上进行测试