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

时间:2017-08-17 01:00:38

标签: r pattern-matching dplyr stringr 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

我想更改符合此条件的行

如果_之后的字符串为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

谢谢!

修改::

如果我有这样的数据:

    clas
1   CD_1
2  X.2_2
3  K$2_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$2_3
4 12kB_4
5   .B_5
6  xB_11

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

1 个答案:

答案 0 :(得分: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"))

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

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

编辑:

[1111]内的每个字符都会被单独处理,因此[1]|没有区别,因为该模式只匹配1或1或1或1的单个字符相反,您需要使用(.)(_[45]|_11),因此您拥有_4。这与第二个模式组中的_5_11(.)(_[45])$匹配。此外,如果您想匹配1-9但不匹配11或15,则需要使用$,其中server.py是字符串结束指示符。去看看备忘单并在RegExr上测试它们。