我try 在data.table
中进行非等分连接,并提取该连接中连接的最小值/最大值.
set.seed(42)
dtA <- data.table(id=rep(c("A","B"),each=3), start=rep(1:3, times=2), end=rep(2:4, times=2))
dtB <- data.table(id=rep(c("A","B"),times=20), time=sort(runif(40, 1, 4)))
当它在start
和end
之间(以及id
)时,我希望保留最小/最大值time
.名义上这只是一个非等联接,但我找不到by=.EACHI
或mult="..."
的组合来得到我想要的.相反,最小/最大值通常与我需要的范围不一致.遗憾的是,roll=
不支持非等距范围.
dtA[dtB, c("Min", "Max") := .(min(time), max(time)),
on = .(id, start <= time, end > time), mult = "first"]
# id start end Min Max
# <char> <int> <int> <num> <num>
# 1: A 1 2 1.011845 3.966675
# 2: A 2 3 1.011845 3.966675
# 3: A 3 4 1.011845 3.966675
# 4: B 1 2 1.011845 3.966675
# 5: B 2 3 1.011845 3.966675
# 6: B 3 4 1.011845 3.966675
dtA[dtB, c("Min", "Max") := .(min(time), max(time)),
on = .(id, start <= time, end > time), by = .EACHI]
# id start end Min Max
# <char> <int> <int> <num> <num>
# 1: A 1 2 1.858419 1.858419
# 2: A 2 3 2.970977 2.970977
# 3: A 3 4 3.934679 3.934679
# 4: B 1 2 1.766286 1.766286
# 5: B 2 3 2.925237 2.925237
# 6: B 3 4 3.966675 3.966675
第二个是最接近的("Max"是正确的),但我希望能够得到的是:
id start end Min Max
<char> <num> <int> <num> <num>
1: A 1 2 1.011845 1.858419
2: A 2 3 2.170610 2.970977
3: A 3 4 3.115194 3.934679
4: B 1 2 1.022002 1.766286
5: B 2 3 2.164325 2.925237
6: B 3 4 3.055509 3.966675
真正的问题是大约有400K左右的行,范围连接在2Mi行值中,所以我不想对两个帧进行完全扩展,而是手动将其减少到dtA
行.
(我愿意接受collapse
条建议.)