根据双重条件替换字符串

时间:2017-05-24 11:37:46

标签: r regex stringr

假设我有一个数据框:

df <- data.frame(a=c("m,dt,f,m","dt,t,d,e","m,t,e,x", "m,x,dt,f"))

我想搜索包含&#34; m&#34;的行。 &安培; &#34; DT&#34;在字符串中。也就是说,&#34; m&#34; &安培; &#34; DT&#34;需要出席。所以在上面的数据框架中,第1行和第4行符合条件,但不满足2或3 - 但它们都包含&#34; m&#34;或&#34; dt&#34;。一旦我找到它们,我想用另一个字符串替换它们,比如说&#34; John&#34;。

所以,df [1,1]等于&#34; John,f,m&#34;甚至&#34; John&#34; (那会更好)。

我一直在使用stringr包但似乎无法弄清楚如何获得条件&#34; m&#34; &安培; &#34; DT&#34;坚持。仅供参考 - 我正在做以下变种:

b <-  a$a %>% str_replace_all("dt|m","John")

目前我有&#34;或&#34;条件,但我需要弄清楚&#34;和&#34;条件。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

使用前瞻的完整示例:

library("stringr")
df <- data.frame(a=c("m,dt,f,m","dt,t,d,e","m,t,e,x", "m,x,dt,f"), stringsAsFactors = FALSE)
df$a[str_detect(df$a, "(?=.*\\bm\\b)(?=.*\\bdt\\b)")] = "John"
df

这使用了两个pos。每个网站上分别带有mdt以及“边界”的前瞻。

(?=.*\bm\b)   # looking for m with "boundaries
(?=.*\bdt\b)  # looking for dt with "boundaries"