我有这两张表
library(data.table)
d = seq(0.1,1,by = 0.1)
n = length(d)
dtBig = data.table(id = rep(letters[1:2],each = n/2),
d1 = d,
d2 = d + 0.2,
i = 1:n)
dtSmall = data.table(id = rep(letters[1:2],each = 2),
d_start = c(0.2,0.65,0.15,1.1),
d_end = c(0.65,0.85,0.8,1.5))
我想进行有效的合并id
有两个不等式条件d1 >= d_start
and d2 <= d_end
.
当表有很多行时,第一种方法非常耗时:
dtAll = merge(dtSmall, dtBig, by = "id", allow.cartesian = T)[d1 >= d_start & d2 <= d_end]
所以我使用“on”运算符:
dtAll2 = dtBig[dtSmall, on = .(id, d1 >= d_start, d2 <= d_end),nomatch = 0]
但是,d1 采用 d_start 的值和 d_end 的 d2 的值,并且我丢失了 d1 和 d2 的值。
所以我做了这些命令:
dtAll2 = dtBig[dtSmall, on = .(id, d1 >= d_start, d2 <= d_end),nomatch = 0]
dtAll2[,`:=`(d_start = d1, d_end = d2)]
dtAll2[,`:=`(d1 = NULL, d2 = NULL)]
dtAll2 = dtAll2[dtBig[,.(i,d1,d2)],on = .(i == i),nomatch = 0]
验证 dtAll 和 dtAll2 是否相同:
setcolorder(dtAll, names(dtAll2))
setkey(dtAll,i)
setkey(dtAll2,i)
all.equal(dtAll,dtAll2)
但我确信有更好的方法,有什么想法吗?