2012-10-11 18 views
11

Mam następującą ramkę danych, z której chciałbym wyodrębnić wiersze na podstawie pasujących ciągów znaków.Jak dokonać podziału danych z wyprzedzeniem pasującym do łańcucha znaków

> 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 

Chciałbym więc wydobyć np. dwa rzędy w oparciu o dopasowanie ciągów w $ RefSeq_ID, że działa dobrze z następujących czynności:

> 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 

Ale niektóre wiersze mają kilka RefSeq_IDs oddzielone przecinkami, więc szukam ogólny sposób mówienia, jeśli $ RefSeq_ID zawiera określony wzorzec ciągu, a następnie podzbiór tego wiersza.

Odpowiedz

15

Aby dopasować częściowe, należy użyć wyrażeń regularnych (patrz ?grepl). Oto rozwiązanie konkretnego problemu:

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

Aby przetestować jedną sekwencję naraz, po prostu wybrać konkretny identyfikator SEQ:

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 

przetestować dla wielu genów, używamy operatora |:

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 

Więc

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

powinien dać ci to, co chcesz.

+0

Dzięki! wykonuje to doskonale ... Próbowałem z grepl, ale ponieważ zajmuje tylko pierwszy element wektora, nie mogłem go uruchomić. Pomijasz to przez wklejenie (l, collapse = "|") Więc to jest ciągi oddzielone znakiem lub? Myślę, że powinienem wyglądać bardziej w wyrażeniach regularnych :-) –

+0

Tak, ciągi są oddzielone "OR" – csgillespie

1

Innym podejściem jest rozpoznawanie zduplikowanych wpisów w RefSeq_ID jako próba reprezentowania dwóch tabel z bazą danych w pojedynczej ramce danych. Więc jeśli oryginalna tabela jest csv, następnie normalizacji danych do dwóch tabel

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)) 

i uznać, że zapytanie jest subset (wybierz) na stole RefSeq, następnie merge (join) z Anno

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

prowadzi do

> 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 

Być może celem jest połączyć ze stołem Master”`, następnie

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

lub podobny.

Powiązane problemy