在下面的示例中,我如何引用同一链中的变量但之前计算过的变量:
library(data.table)
mtdt<-as.data.table(mtcars)
mtdt[,.(mpg1=mean(mpg),disp1=mean(disp)),by=cyl][,`:=`(mbyd=mpg1/disp1)] # this works
但是,我一直在寻找这样的解决方案:
mtdt[,.(mpg1=mean(mpg),disp1=mean(disp),mbyd=mpg1/disp1),by=cyl]
Error in `[.data.table`(mtdt, , .(mpg1 = mean(mpg), disp1 = mean(disp), :
object 'mpg1' not found
我一直认为可以引用之前的变量。可能是我在这里遗失了什么?
P.S。我不是在寻找其他软件包的解决方案。
答案 0 :(得分:4)
如果我们需要在现有数据集中创建三个新变量,
mtdt[, c('mpg1', 'disp1', 'mybd') := {tmp1 <- mean(mpg)
tmp2 <- mean(disp)
list(tmp1, tmp2, tmp1/tmp2)}, by = cyl]
或者,如果我们只关注三个变量的摘要以及'cyl'
mtdt[, {tmp1 <- mean(mpg)
tmp2 <- mean(disp)
list(mpg1 = tmp1, disp1 = tmp2, mybd = tmp1/tmp2)}, by = cyl]
# cyl mpg1 disp1 mybd
#1: 6 19.74286 183.3143 0.10769950
#2: 4 26.66364 105.1364 0.25361003
#3: 8 15.10000 353.1000 0.04276409