将基于机器的行突变为通用的用户定义字符串
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.
上进行测试
我有这样的数据
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.