2016-04-04 2 views
0

У меня есть этот фреймворк с именем 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 

ответ

2

Мы можем использовать str_extract и матч еще один элементы, которые не : ([^:]+), а затем , (с использованием регулярных выражений lookaround)

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

Or чтобы быть более точным, мы сопоставляем : (используя регулярное выражение), а затем '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"