【发布时间】:2026-01-16 08:45:01
【问题描述】:
我在表中有一些数据,我想做一个非 equi 连接(我认为这是正确的术语),并针对不同的组按不同的范围对其进行过滤。在下面的示例中,我想过滤组“a”,使其仅返回 1 和 20(含)之间的值和组“b”,因此它仅返回 80 和 100(含)之间的值。我的阅读表明 inrange 应该是要使用的项目。我知道如何在一般情况下使用它,但我不确定如何让它在不同的范围内按组运行。 (示例代码改编自?inrange)
创建样本数据
set.seed(1234)
Y = data.table(a=sample(1:100,100), val=runif(100), group=c(rep("a",50),rep("b",50)))
range = data.table(group=c("a","b"),start = c(1,80), end = c(20,100))
尝试过滤
Y[inrange(a, range$start, range$end),,by=group]
这显然不起作用,而是将这些范围应用于整个数据集并抛出错误消息Ignoring by= because j= is not supplied。我想我很清楚这不起作用,因为我没有在范围表和 Y 之间创建“连接”,但我没有看到如何通过inrange 使两个表进行分组通信。
注意:实际上 a 中的值将是 posixct 日期时间,但为了简单起见,我在这里没有使用它。
【问题讨论】:
-
您是否意识到
runif是从[0,1]提取的,而您的range似乎在[0,100]上? -
val只是一个额外的列来近似真实数据(有额外的列可供使用)。过滤应在a上。我认为没有问题。 -
哦,我错过了加入
a,这似乎很清楚(也很明显),我的错 :-)
标签: r data.table non-equi-join