我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)))

当它在startend之间(以及id)时,我希望保留最小/最大值time.名义上这只是一个非等联接,但我找不到by=.EACHImult="..."的组合来得到我想要的.相反,最小/最大值通常与我需要的范围不一致.遗憾的是,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条建议.)

推荐答案

切换连接使其为B[A],然后指定Inside A:

dtA[,
    c("min","max") := dtB[
        dtA,
        on=.(id, time >= start, time < end), 
        .(min=min(x.time), max=max(x.time)),
        by=.EACHI][, c("min","max")]
    ]
dtA

#       id start   end      min      max
#   <char> <int> <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

您可以看到它需要旋转,否则.EACHI组最终是针对B中的每个单独行,而不是A条件内B中的匹配行:

dtB[dtA, on=.(id, time >= start, time < end), .N, by=.EACHI]
#       id  time  time     N
#   <char> <int> <int> <int>
#1:      A     1     2     5
#2:      A     2     3     6
#3:      A     3     4     9
#4:      B     1     2     4
#5:      B     2     3     6
#6:      B     3     4    10

dtA[dtB, on=.(id, start <= time, end > time), .N, by=.EACHI][, .(freq=.N), by=N]
#       N  freq
#   <int> <int>
#1:     1    40

这在help("data.table::special-symbols")描述的背景下是有意义的:

它的用法是‘BY=.EACHI’(或‘KEYBY=.EACHI’),调用 grouping-by-each-row-of-i

DT[i, j, by]逻辑中,dtA需要为分组贡献行.

R相关问答推荐

从具有随机模式的字符串中提取值

创建重复删除的唯一数据集组合列表

如何自定义Shapviz图?

如何从R中的字符串元素中减go 一个数字?

整数成随机顺序与约束R?

ggplot2中的X轴显示数值,单位为百,而不是十

R for循环返回到先前值

使用strsplit()将向量操作为数据框

S用事件解决物质平衡问题

如何在R forestplot中为多条垂直线分配唯一的 colored颜色 ?

R:从geom_ol()中删除轮廓并导出为pdf

仅在Facet_WRAP()中的相应方面包含geom_abline()

SHINY:使用JS函数应用的CSS样式显示HTML表格

您是否可以将组添加到堆叠的柱状图

R中有约束的优化问题:如何用复数和对数效益函数解决问题?

如何从向量构造一系列双边公式

R如何将列名转换为更好的年和月格式

按组内中位数分类

通过匹配另一个表(查找表)中的列值来填充数据表,并在另一个变量上进行内插

对数据帧中的列进行子集设置以通过迭代创建新的数据帧