R表1:在现实中有更多的行
PatientID chr pos type end length
AB1 1 2431 DEL 2100 -331
AC3 1 98041 INV 99100 1059
AG6 1 8743 BND 9000 257
表2:实际上有更多行,列2和列3是外显子
的范围Exon 2001 2500
Exon 8700 8750
期望输出:表1中变体(来自后端)的任何部分位于表2中外显子范围的任何地方的行
输出:
PatientID chr pos type end length
AB1 1 2431 DEL 2100 -331
AG6 1 8743 BND 9000 257
我已经尝试了一个子集:
subset(table1$pos >= table2$V2 | table1$end <= table$end)
,但这并没有给我想要的输出。如有任何帮助,不胜感激。
祝一切顺利
如果我理解正确的话,您希望找到(对于表2中的至少一个范围,r)满足以下条件中的至少一个的变体:
table1$end
rtable1$pos
rtable1$pos
和table2$end
在r 的两侧
下面是所有可能性的示意图,r由括号分隔,并用连字符表示的变体以及满足的条件数量。
-[- ] 1.
[ -]- 2.
[ - ] 1. and 2.
-[---]- 3.
请注意,下面的代码假设(与表1不同)table2[, 2]
<=table2[, 3]
.
# simplified table1
table1 <- data.frame(pos=c(2431, 98041, 8743), end=c(2100, 99100, 9000))
table2 <- data.frame(exon='Exon', from=c(2001, 8700), to=c(2500, 8750))
is.within <- apply(table1[, c('pos', 'end')], 1, function(x) {
x <- sort(x) # make sure x[1] <= x[2], i.e. pos <= end
any((x[1] >= table2[, 2] & x[1] <= table2[, 3]) | # 1.
(x[2] >= table2[, 2] & x[2] <= table2[, 3]) | # 2.
(x[1] <= table2[, 2] & x[2] >= table2[, 3])) # 3.
})
table1[is.within, ]