我有两张 table 。第一个看起来像:
V1 V2
128 1.0000
139 0.9375
141 1.0000
第二个看起来像:
V1 V2 V3
gene 90 100
mRNA 120 129
CDS 130 139
CDS 140 150
第二个表中的 V2 和 V3 是范围的边界(例如 90:100、120:129 等) 所以我需要比较第一个表的 V1 中的数字是否属于任何范围。如果是这样,我需要将这些行绑定(bind)在一起。 所以它看起来像
V1.1 V2.1 V1.2 V2.2 V3.2
128 1.0000 mRNA 120 129
139 0.9375 CDS 130 139
141 1.0000 CDS 140 150
或者……。
问题是这些表真的很大(每个大约 5G)。
提前谢谢您。
最佳答案
考虑到数据集的大小,我建议在 data.table
包中使用 foverlaps
:
library(data.table)
##
setDT(d1)
setDT(d2)
##
setnames(d2,c("V1.y","V2.y","V3.y"))
setkeyv(d2,c("V2.y","V3.y"))
##
setnames(d1,c("V1.x","V2.x"))
d1[,V11:=V1.x]
##
Merged <- foverlaps(
x=d1,y=d2,
by.x=c("V1.x","V11"),
type="within")
Merged[,V11:=NULL]
##
R> Merged
V1.y V2.y V3.y V1.x V2.x
1: mRNA 120 129 128 1.0000
2: CDS 130 139 139 0.9375
3: CDS 140 150 141 1.0000
为了清楚起见,我附加了 .x
和 .y
。 foverlaps
主要用于连接两个范围,每个使用的表中都有一个范围,因此它要求 by.x
在 中指定两个(不同的)列x
对象。我知道在这种情况下解决这个问题的唯一方法是,我们希望 x 的一列位于 y 的两列的范围内创建临时重复列。这就是d1[,V11:=V1.x]
的目的;随后被删除。
数据:
d1 <- read.table(
text="V1 V2
128 1.0000
139 0.9375
141 1.0000",
header=TRUE)
d2 <- read.table(
text="V1 V2 V3
gene 90 100
mRNA 120 129
CDS 130 139
CDS 140 150",
header=TRUE)
关于R,如果一个表中的数字属于另一个表中的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27622913/