data.table
。第一个定义了一组带有起始和结束位置的区域 'x':library(data.table)
d1 <- data.table(x = letters[1:5], start = c(1,5,19,30, 7), end = c(3,11,22,39,25))
setkey(d1, x, start)
# x start end
# 1: a 1 3
# 2: b 5 11
# 3: c 19 22
# 4: d 30 39
# 5: e 7 25
第二个数据集具有相同的分组变量“x”,以及每个组内的位置“pos”:
d2 <- data.table(x = letters[c(1,1,2,2,3:5)], pos = c(2,3,3,12,20,52,10))
setkey(d2, x, pos)
# x pos
# 1: a 2
# 2: a 3
# 3: b 3
# 4: b 12
# 5: c 20
# 6: d 52
# 7: e 10
最终我想要在每个组x
中提取'd2'中'pos'落在'start'和'end'定义的范围内的行。期望结果为:
# x pos start end
# 1: a 2 1 3
# 2: a 3 1 3
# 3: c 20 19 22
# 4: e 10 7 25
任何组 x
的起始/结束位置永远不会重叠,但可能存在没有任何区域的值间隙。现在,我认为我应该使用滚动连接。从我所看到的情况来看,我无法在连接中使用“end”列。
我已经尝试过。
d1[d2, roll = TRUE, nomatch = 0, mult = "all"][start <= end]
and got# x start end
# 1: a 2 3
# 2: a 3 3
# 3: c 20 22
# 4: e 10 25
哪一组行是我想要的正确集合; 然而“pos”已经变成了“start”,原始的“start”已经丢失了。是否有一种方法可以通过滚动连接来保留所有列,以便我可以报告所需的“start”,“pos”,“end”?