r - data.table:通过引用聚合、连接和分配

标签 r data.table split-apply-combine

让我们将 dta 称为我要分配给的表,并将 dts 称为我要加入并聚合到 dta 的数据源。

dta = data.table(i=1:4, x=rnorm(4))
dts = data.table(i=rep(1:3, each=3), z=runif(9))

我认为我应该能够加入“i”并在一个语句中对其进行聚合:

dta[dts, z_sum := sum(i.z), by=i, on='i']

可惜,这行不通

Error in `[.data.table`(dta, dts, `:=`(z_sum, sum(i.z)), by = i, on = "i") : 
  object 'i.z' not found

Enter a frame number, or 0 to exit   

1: dta[dts, `:=`(z_sum, sum(i.z)), by = i, on = "i"]
2: `[.data.table`(dta, dts, `:=`(z_sum, sum(i.z)), by = i, on = "i")

替换 by=iby=.EACHI给出错误的结果(zdts 的最后一个值 i 变量的每个值)

并由 by 遗漏完全只是对所有值求和dts$z并将相同的值分配给 dta 中的所有行.

现在,我可以:

dta[dts[, .(z=sum(z)), keyby=i], z := i.z, on='i']

但似乎应该有一些方法可以与 data.table 内部交互,以便在一个有效的语句中正确地实现这一点,而不是在这里完成单独的聚合然后连接。

我是否遗漏了什么,或者这是做事的最佳方式?我正在执行非常大的联接(将具有数亿行的表合并数千次),因此能够充分利用所有效率非常重要。

最佳答案

我们可以使用.EACHI

dta[, z_sum := dts[.SD, on = .(i), sum(z), by = .EACHI]$V1]

数据

set.seed(24)
dta = data.table(i=1:4, x=rnorm(4))
dts = data.table(i=rep(1:3, each=3), z=runif(9))

关于r - data.table:通过引用聚合、连接和分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47150744/

相关文章:

R ggplot 2 图例边框问题

r - R中启动库的cv.glm中的成本函数

r - 在 R 中将日期转换为特定格式的字符

r - data.table 上的频率表,包括未使用值的零

python - 使用 split-apply-combine 通过自定义函数删除一些值并合并剩下的值

MATLAB:在 SPLITAPPLY 内部使用时从 ISMEMBER 返回两个参数

r - 用于配对 Wilcoxon 检验的带有 p 值的动画 fiddle /箱线图

r - 如何使用带公式作为字符串的dcast.data.table

r - 在 R data.table 中转换多个列类时出现问题

python - Pandas 将函数应用于组,并过滤​​原始数据框