【发布时间】:2014-07-22 02:40:27
【问题描述】:
可怕的标题问题,但这是我想要达到的目标。对于 Table1,我想添加“BETWEEN”列,验证“POSITION”是否介于 Table2 中相应“BIN”的“START”和“STOP”值之间。
表 1。 BIN 名称(字符)和 BIN 中的 POSITION(数字):
BIN POSITION
1 12
1 52
1 86
7 6
7 22
X 112
X 139
MT 3
MT 26
Table2:BIN 名称(字符)和 START 和 STOP 位置(数字)
BIN START STOP
1 2 64
1 90 110
7 20 100
7 105 200
X 1 5
MT 1 1000
以及想要的结果 - 表 1 带有“BETWEEN”:
CHROM POSITION BETWEEN
1 12 TRUE
1 52 TRUE
1 86 FALSE
7 6 FALSE
7 22 TRUE
X 112 FALSE
X 139 FALSE
MT 3 TRUE
MT 26 TRUE
我的表 1 大约有 4,000,000 行,表 2 大约有 500,000 行,我想出的任何东西都很慢。
作为更大表的示例,请使用以下内容:
positions <- seq(1,100000,10)
bins <- c("A","B","C","D","E","F","G","H","I","J")
tab1 <- data.table(bin = rep(bins,1,each=length(positions)), pos = rep(positions,10))
tab2 <- data.table(bin = rep(bins,1,each=2000), start = seq(5,100000,50), stop = start+25)
期望的输出是:
tab1
bin pos between
1: A 1 FALSE
2: A 11 TRUE
3: A 21 TRUE
4: A 31 FALSE
5: A 41 FALSE
【问题讨论】:
-
如果您的 BIN 标识符不是 1 对 1 匹配,那么您的 Table1 和 Table2 的大小如何?您指出 Bin 1 - Position is 86 是 False。你能解释为什么它是假的吗?因为 Table2 中没有第三个 Chrom 1?为什么Table2第二行,Bin1 Start 90 Stop 110 不满足条件。
-
@Vlo 表 1 中的每一行都针对表 2 中所有匹配的 BIN 行进行测试,以生成一个输出行,如果表 2 的任何 START/STOP 值包含该表,则该输出行的 BETWEEN=TRUE 1 个职位。
-
@Pete 给定 BIN 的 START 和 STOP 对是否重叠?对于给定的 BIN,它是否按 START 排序?对于这两个问题,您的示例都是如此,但是如果总体而言,您可以使用二进制搜索来加快速度。另外,START 和 STOP 的最大值是多少?如果它们不是太大,则可以制作一个查找表....
-
Bin 1 - 位置 8 为 FALSE,因为表 2 中 Bin 1 的 START/STOP 边界是 2-64 和 90-110。 86 不在这些边界之间,所以它是 FALSE
-
@Spacedman BIN 中的 START 和 STOP 对不应重叠(如果重叠,它们会折叠成一行)。 BIN 1 是最大的,在表 2 中有大约 250,000,000 个位置和大约 350,000 个范围。
标签: r data.table