在 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.
假设我有一个 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.