data.table:通过引用聚合、连接和赋值
data.table: aggregate, join, and assign by reference
我们将 dta 称为我要分配给的 table,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=.EACHI
替换 by=i
给出了错误的结果(i
变量的每个值的 dts
中 z
的最后一个值)
并完全忽略 by
只是对所有值 dts$z
求和并将相同的值分配给 dta
.
中的所有行
现在,我可以做到:
dta[dts[, .(z=sum(z)), keyby=i], z := i.z, on='i']
但似乎应该有某种方式可以与 data.table 内部交互,以便在一个有效的语句中做到这一点,而不是单独聚合然后在此处完成连接。
我是不是遗漏了什么,或者这是最好的做事方式?我正在做非常大的连接(将 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))
我们将 dta 称为我要分配给的 table,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=.EACHI
替换 by=i
给出了错误的结果(i
变量的每个值的 dts
中 z
的最后一个值)
并完全忽略 by
只是对所有值 dts$z
求和并将相同的值分配给 dta
.
现在,我可以做到:
dta[dts[, .(z=sum(z)), keyby=i], z := i.z, on='i']
但似乎应该有某种方式可以与 data.table 内部交互,以便在一个有效的语句中做到这一点,而不是单独聚合然后在此处完成连接。
我是不是遗漏了什么,或者这是最好的做事方式?我正在做非常大的连接(将 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))