根据加工方式将行变为普遍使用的用户定义字符串

Ale*_*der 1 r pattern-matching stringr dplyr grepl

我有这样的数据

 clas=c("CD_1","X.2_2","K$2_3","12k3_4",".A_5","xy_6")
 df <- data.frame(clas)
> df
    clas
1   CD_1
2  X.2_2
3  K$2_3
4 12k3_4
5   .A_5
6   xy_6
Run Code Online (Sandbox Code Playgroud)

我想改变一些符合这种条件的行

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

    clas
1   CD_1
2  X.2_2
3  K$2_3
4 12kB_4
5   .B_5
6   xB_6
Run Code Online (Sandbox Code Playgroud)

谢谢!

编辑::

如果我有这样的数据:

    clas
1   CD_1
2  X.2_2
3  K$2_3
4 12k3_4
5   .A_5
6  xy_11
Run Code Online (Sandbox Code Playgroud)

然后应用您的解决方案

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

    clas
1   CB_1
2  X.2_2
3  K$2_3
4 12kB_4
5   .B_5
6  xB_11
Run Code Online (Sandbox Code Playgroud)

但我只想匹配111.我们怎么做?

shi*_*ans 5

library(dplyr)
library(stringr)

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

df %>% mutate(clas = str_replace(clas, "(.)(_[456])", "B\\2"))
Run Code Online (Sandbox Code Playgroud)

这里放置匹配模式创建一个与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上测试它们.