根据两个列是否属于r中查找表的任何引用范围来对表进行子集



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)满足以下条件中的至少一个的变体:

  1. table1$endr
  2. table1$posr
  3. table1$postable2$endr
  4. 的两侧

下面是所有可能性的示意图,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, ]

最新更新