在 R data.table 中链接时设置密钥

Setting key while chaining in R data.table

假设我有一个 data.table DT,其中包含 a, b, c 列。我想根据 a 筛选行(例如,select 仅那些值为 "A" 的行),计算 b 乘以 c 的总和。我可以通过

使用二进制搜索进行过滤来有效地做到这一点
setkey(DT, a)
DT[.("A"), .(sum.B = sum(B)), by = .(C)]

如果我想根据新获得的值sum.b过滤行怎么办?如果我想保留 sum.b 等于 c(3, 4, 5) 之一的行,我可以说

DT[.("A"), .(sum.B = sum(B)), by = .(C)][sum.b %in% c(3, 4, 5)]

但是后面的操作使用了向量扫描,速度很慢。有没有办法在链接时设置键 "on the fly" ?理想情况下我会

DT[.("A"), .(sum.B = sum(B)), by = .(C)][??set sum.b as key??][.(c(3, 4, 5))]

我不知道中间的步骤。

您在问题中提出的中间步骤如下:

# unnamed args
DT[,.SD,,sum.b]
# named args
DT[j = .SD, keyby = sum.b]
# semi named
DT[, .SD, keyby = sum.b]

但是您应该根据您的数据对其进行基准测试,因为它可能比向量扫描慢,因为您需要设置密钥。

eddi 似乎已经在评论中提供了该解决方案。他说的FR是data.table#1105.