2012-10-11 21 views
11

Tôi có khung dữ liệu sau đây mà tôi muốn trích xuất các hàng dựa trên các chuỗi phù hợp.Cách đặt dữ liệu có khớp chuỗi trước

> 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 

Vì vậy, tôi muốn trích xuất ví dụ: hai hàng dựa trên phù hợp với chuỗi trong $ RefSeq_ID, mà hoạt động tốt với những điều sau:

> 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 

Nhưng một số các hàng đã nhiều RefSeq_IDs tách bằng dấu phẩy, vì vậy tôi đang tìm kiếm một cách tổng quát về nói nếu $ RefSeq_ID chứa một mẫu chuỗi nhất định và sau đó đặt lại hàng đó.

Trả lời

15

Để thực hiện đối sánh một phần, bạn cần phải sử dụng cụm từ thông dụng (xem ?grepl). Dưới đây là một giải pháp cho vấn đề cụ thể của bạn:

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

Để kiểm tra một chuỗi tại một thời điểm, chúng ta chỉ cần chọn một id seq cụ thể:

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 

Để kiểm tra cho nhiều gen, chúng tôi sử dụng các nhà điều hành |:

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 

Vì vậy

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

sẽ cung cấp cho bạn những gì bạn muốn.

+0

Cảm ơn! nó thực hiện công việc một cách hoàn hảo ... Tôi đã thử với grepl, nhưng vì nó chỉ lấy yếu tố đầu tiên của một vector tôi không thể làm cho nó hoạt động được. Bạn bỏ qua điều này bằng cách dán (l, collapse = "|") Vì vậy, đây là chuỗi tách với hoặc? Tôi nghĩ rằng tôi nên nhìn nhiều hơn vào các biểu thức thông thường :-) –

+0

Có, các chuỗi được phân tách bằng "OR" – csgillespie

1

Cách tiếp cận khác là nhận dạng các mục nhập trùng lặp trong RefSeq_ID như là một nỗ lực biểu diễn hai bảng cơ sở dữ liệu trong một khung dữ liệu duy nhất. Vì vậy, nếu bảng ban đầu là csv, sau đó bình thường hóa các dữ liệu vào hai bảng

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

và nhận ra rằng truy vấn là một subset (chọn) trên bảng RefSeq, tiếp theo là một merge (tham gia) với Anno

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

dẫn đến

> 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 

có lẽ mục tiêu là để hợp nhất với một 'bảng Thạc sĩ `, sau đó

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

hoặc tương tự.

Các vấn đề liên quan