如何选择列中用逗号分隔的第一组元素

时间:2016-04-04 03:23:13

标签: r

我有一个名为newdf的数据框。我想创建一个新列colC,其中第一个元素在newdf[,"colB"]中用逗号分隔,但只包含以“:p。”开头的值。并以逗号,结尾)并使用列colC获取结果。

newdf<-structure(list(colA = structure(1:3, .Label = c("a", "b", "c"
), class = "factor"), colB = structure(1:3, .Label = c("EN1:c.12CTG:p.L287fs,ENSG:p.L287fs,ENSG:exon10:TG:p.L258fs", 
"TG:p.L28fs,TG:p.L28fs.TG:p.L28fs", "TG:p.L2fs,TG:p.L8fs"), class = "factor")), .Names = c("colA", 
"colB"), row.names = c(NA, -3L), class = "data.frame")

结果

 colA                                                       colB        colC
    a       EN1:c.12CTG:p.L287fs,ENSG:p.L287fs,ENSG:exon10:TG:p.L258fs  p.L287fs
    b                                 TG:p.L28fs,TG:p.L28fs.TG:p.L28fs  p.L28fs
    c                                              TG:p.L2fs,TG:p.L8fs  p.L2fs

1 个答案:

答案 0 :(得分:2)

我们可以使用str_extract并匹配另外一个不是:[^:]+)的元素,后跟,(使用正则表达式外观)

library(stringr)
newdf$colC <- str_extract(newdf$colB, "[^:]+(?=,)")
newdf$colC
#[1] "p.L287fs" "p.L28fs"  "p.L2fs"   

或者为了更准确一点,我们匹配:(使用正则表达式外观)后跟'p'后跟.\\.)后跟另外一个字符这不是,[^,]+

str_extract(newdf$colB, "(?<=:)p\\.[^,]+")
#[1] "p.L287fs" "p.L28fs"  "p.L2fs"  

相同的模式可以与sub使用捕获组

一起使用
sub("^[^p]+(?<=:)(p\\.[^,]+).*", "\\1", newdf$colB, perl=TRUE)
#[1] "p.L287fs" "p.L28fs"  "p.L2fs"