2012-10-11 61 views
11

我有以下數據框,我想從中根據匹配的字符串提取行。如何使用高級字符串匹配子集數據

> GEMA_EO5 
gene_symbol fold_EO p_value       RefSeq_ID  BH_p_value 
     KNG1 3.433049 8.56e-28    NM_000893,NM_001102416 1.234245e-24 
     REXO4 3.245317 1.78e-27       NM_020385 2.281367e-24 
     VPS29 3.827665 2.22e-25     NM_057180,NM_016226 2.560770e-22 
    CYP51A1 3.363149 5.95e-25    NM_000786,NM_001146152 6.239386e-22 
     TNPO2 4.707600 1.60e-23 NM_001136195,NM_001136196,NM_013433 1.538000e-20 
     NSDHL 2.703922 6.74e-23    NM_001129765,NM_015922 5.980454e-20 
    DPYSL2 5.097382 1.29e-22       NM_001386 1.062868e-19 

因此,我想提取例如基於在$ RefSeq_ID,與下面的工作正常字符串匹配兩行:

> list<-c("NM_001386", "NM_020385") 
> GEMA_EO6<-subset(GEMA_EO5, GEMA_EO5$RefSeq_ID %in% list, drop = TRUE) 

> GEMA_EO6 

gene_symbol fold_EO p_value RefSeq_ID BH_p_value 
     REXO4 3.245317 1.78e-27 NM_020385 2.281367e-24 
    DPYSL2 5.097382 1.29e-22 NM_001386 1.062868e-19 

但有些行已用逗號分隔的多個RefSeq_IDs,所以我找講的一般方式,如果$ RefSeq_ID包含一個特定的字符串模式,然後子集該行。

回答

15

要做部分匹配,您需要使用正則表達式(請參閱?grepl)。這裏是您的特定問題的解決方案:

##Notice that the first element appears in 
##a row containing commas 
l = c("NM_013433", "NM_001386", "NM_020385") 

要一次測試一個順序,我們只是選擇一個特定的序列號:

R> subset(GEMA_EO5, grepl(l[1], GEMA_EO5$RefSeq_ID)) 
    gene_symbol fold_EO p_value       RefSeq_ID BH_p_value 
5  TNPO2 4.708 1.6e-23 NM_001136195,NM_001136196,NM_013433 1.538e-20 

爲了檢測多個基因,我們使用|操作:

R> paste(l, collapse="|") 
[1] "NM_013433|NM_001386|NM_020385" 
R> grepl(paste(l, collapse="|"),GEMA_EO5$RefSeq_ID) 
[1] FALSE TRUE FALSE FALSE TRUE FALSE TRUE 

所以

subset(GEMA_EO5, grepl(paste(l, collapse="|"),GEMA_EO5$RefSeq_ID)) 

應該給你你想要的。

+0

謝謝!它完美地完成了這項工作......我曾經嘗試過使用grepl,但由於它只採用矢量的第一個元素,所以我無法使其工作。你繞過這個貼(l,collapse =「|」)所以這是用or分隔的字符串嗎?我想我應該更多地看正則表達式:-) –

+0

是的,字符串用「ORs」分隔 – csgillespie

1

另一種方法是將RefSeq_ID中的重複條目識別爲嘗試在單個數據框中表示兩個數據庫表。所以,如果原來的表是csv,然後將數據歸到兩個表中

Anno <- cbind(key = seq_len(nrow(csv)), csv[,names(csv) != "RefSeq_ID"]) 
key0 <- strsplit(csv$RefSeq_ID, ",") 
RefSeq <- data.frame(key = rep(seq_along(key0), sapply(key0, length)), 
        ID = unlist(key0)) 

,並認識到,查詢是在RefSeqsubset(選擇),其次是merge(連接)與安諾

l <- c("NM_013433", "NM_001386", "NM_020385") 
merge(Anno, subset(RefSeq, ID %in% l))[, -1] 

導致

> merge(Anno, subset(RefSeq, ID %in% l))[, -1] 
    gene_symbol fold_EO p_value BH_p_value  ID 
1  REXO4 3.245317 1.78e-27 2.281367e-24 NM_020385 
2  TNPO2 4.707600 1.60e-23 1.538000e-20 NM_013433 
3  DPYSL2 5.097382 1.29e-22 1.062868e-19 NM_001386 

也許我們的目標是與'大師」表進行合併,然後

Master <- cbind(key = seq_len(nrow(csv)), csv) 
merge(Master, subset(RefSeq, ID %in% l))[,-1] 

或類似的。