我有一个名为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
答案 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"