我有这样的数据
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
。我们怎么能这样做?
答案 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上测试它们。