Как подмножить данные с предварительным сопоставлением строк
У меня есть следующий фрейм данных, из которого я хотел бы извлечь строки на основе совпадающих строк.
> 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 содержит определенный строковый шаблон, а затем подмножество этой строки.
Ответы
Ответ 1
Чтобы выполнить частичное совпадение, вам нужно будет использовать регулярные выражения (см. ?grepl
). Вот решение вашей конкретной проблемы:
##Notice that the first element appears in
##a row containing commas
l = c( "NM_013433", "NM_001386", "NM_020385")
Чтобы протестировать одну последовательность за раз, мы просто выбираем определенный seq id:
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))
должен предоставить вам то, что вы хотите.
Ответ 2
Другой подход заключается в распознавании повторяющихся записей в 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
(select) в таблице RefSeq
, за которым следует merge
(join) с 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 <- cbind(key = seq_len(nrow(csv)), csv)
merge(Master, subset(RefSeq, ID %in% l))[,-1]
или аналогичный.