3

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

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给出错误的结果(变量的每个值的最后z一个dtsi

完全省略 byby只是将所有值相加dts$z,并将相同的值分配给dta.

现在,我可以这样做:

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

但似乎应该有某种方式与 data.table 内部进行交互,以便在一个有效的语句中做到这一点,而不是单独的聚合然后加入在这里完成。

我错过了什么,还是这是做事的最佳方式?我正在做非常大的联接(将具有数亿行的表合并数千次),因此能够利用我所能达到的所有效率很重要。

4

1 回答 1

4

我们可以用.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))
于 2017-11-07T05:45:36.997 回答