Как создать подмножество данных с предварительным сопоставлением строк

У меня есть следующий фрейм данных, из которого я хотел бы извлечь строки на основе совпадающих строк.

> 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_ID, разделенных запятыми, поэтому я ищу общий способ определить, содержит ли $RefSeq_ID определенный шаблон строки, а затем подмножить эту строку.


person Toke Duce Krogager    schedule 11.10.2012    source источник


Ответы (2)


Для частичного сопоставления вам необходимо использовать регулярные выражения (см. ?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

So

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

должен дать вам то, что вы хотите.

person csgillespie    schedule 11.10.2012
comment
Спасибо! он отлично справляется со своей задачей... Я пытался использовать grepl, но, поскольку он принимает только первый элемент вектора, я не смог заставить его работать. Вы обходите это с помощью paste(l,collapse=|) Итак, это строки, разделенные или? Я думаю, что мне следует больше изучать регулярные выражения :-) - person Toke Duce Krogager; 12.10.2012
comment
Да, строки разделены оператором ИЛИ - person csgillespie; 12.10.2012

Другой подход заключается в том, чтобы распознать повторяющиеся записи в 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))

и узнайте, что запрос представляет собой subset (выбор) в таблице RefSeq, за которой следует merge (присоединение) с Anno

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', тогда

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

или похожие.

person Martin Morgan    schedule 11.10.2012