R 从具有逗号分隔值的列中提取多个字符串

R 从具有逗号分隔值的列中提取多个字符串,r,regex,R,Regex,我有这样一个数据框: structure(list(mut = c("Q184H/CAA-CAT", "I219V/ATC-GTC", "A314T/GCG-ACG, P373Q/CCG-CAG, A653E/GCG-GAA","0")), row.names = c(NA, -4L), class = c("tbl_df", "tbl", "data.frame")) 我想做的是在一个新的列中获取“/”后面的所有内容,对于每行中的每个逗号分隔的值,不管每行中有多少个条目 我想要的结果是:

我有这样一个数据框:

structure(list(mut = c("Q184H/CAA-CAT", "I219V/ATC-GTC", "A314T/GCG-ACG, P373Q/CCG-CAG, A653E/GCG-GAA","0")), row.names = c(NA, -4L), class = c("tbl_df", "tbl", "data.frame"))
我想做的是在一个新的列中获取“/”后面的所有内容,对于每行中的每个逗号分隔的值,不管每行中有多少个条目

我想要的结果是:

    mut                    nt
1   Q184H                  CAA-CAT
2   I219V                  ATC-GTC
3   A314T, P373Q, A653E    GCG-ACG, CCG-CAG, CGC-GAA
4   0                      0
我已经尝试使用正则表达式来实现这一点,但似乎无法匹配每个用逗号分隔的条目

library(dplyr)
df %>%
    mutate(nt = gsub(".+/(.*?)", "\\1", mut))

如何使每个条目都匹配?我必须把它们分开然后进行匹配吗?

你只需要稍微调整一下你的正则表达式;注意我如何将您的
s更改为
[^,]
s。在正则表达式中,如果将字符放在括号中,前面加一个
^
,则表示匹配除这些字符以外的任何字符。因此,
[^,]+
意味着尽可能多地匹配非逗号的连续字符

df=结构(列表(mut=c(“Q184H/CAA-CAT”、“I219V/ATC-GTC”),
“A314T/GCG-ACG,P373Q/CCG-CAG,A653E/GCG-GAA”,“0”),
row.names=c(NA,-4L),class=c(“tbl_-df”,“tbl”,“data.frame”))
图书馆(dplyr)
#> 
#>正在附加包:“dplyr”
#>以下对象已从“package:stats”屏蔽:
#> 
#>滤波器,滞后
#>以下对象已从“package:base”屏蔽:
#> 
#>相交、setdiff、setequal、并集
df%>%
突变(nt=gsub(“[^,]+?/([^,]+?)”,“\\1”,mut),
mut=gsub(([^/]+)/[^,]+,“\\1”,mut))
#>#tibble:4 x 2
#>mut nt
#>                                    
#>1 Q184H CAA-CAT
#>2 I219V ATC-GTC
#>3 A314T、P373Q、A653E GCG-ACG、CCG-CAG、GCG-GAA
#> 4 0                   0
由(v0.2.1)于2018年10月10日创建,不接受此回答(@duckmayr进行了正则表达式调试)。发布这篇文章是为了向人们展示,通过使用
stringi
我们可以获得自文档正则表达式,这样我们未来的自己就不会憎恨过去的自己:

library(stringi)#stringr就是这么用的
图书馆(tidyverse)

谢谢你!因此,方括号指定逗号“可以”在那里,但不一定要在那里?@Haakonkas我补充了一点额外的解释。这真的很酷——我不知道现在有功能。这对于那些真正粗糙的正则表达式来说是一个救命稻草,它们可以完美地工作,直到它们不工作为止。你必须记住你4年前的想法:-)你的想法非常简单,但它提供了一个很好的机会来提供一个简洁的例子(有文档的正则表达式的例子太少了;即使我用
stringi
回答q,我也和其他人一样有罪)。
library(stringi) # it's what stringr uses
library(tidyverse)

xdf <- structure(list(mut = c("Q184H/CAA-CAT", "I219V/ATC-GTC", "A314T/GCG-ACG, P373Q/CCG-CAG, A653E/GCG-GAA","0")), row.names = c(NA, -4L), class = c("tbl_df", "tbl", "data.frame"))

mutate(
  xdf, 
  nt = stri_replace_all_regex(
    str = mut,
    pattern = "
[^,]+?  # match anything but a comma and if there is one, match at most once
/       # followed by a forward slash
(       # start of match group
 [^,]+? # same as above
)       # end of match group
",
    replacement = "$1", # take the match group value as the value
    opts_regex = stri_opts_regex(comments=TRUE)
  ),
  mut = stri_replace_all_regex(
    str = mut,
    pattern = "
(      # start of match group
 [^/]+ # match anything but a forward slash
)      # end of match group
/      # followed by a forward slash
[^,]+  # match anything but a comma
",
    replacement = "$1", # take the match group value as the value
    opts_regex = stri_opts_regex(comments=TRUE)
  )
)