我正在寻找一个尚未实现(据我所知)通过引用在data.table中按组分配的最佳替代方法。使用data.table示例
DT = data.table(x=rep(c("a","b","c"),each=3), y=c(1,3,6), v=1:9)
x y v
[1,] a 1 1
[2,] a 3 2
[3,] a 6 3
[4,] b 1 4
[5,] b 3 5
[6,] b 6 6
[7,] c 1 7
[8,] c 3 8
[9,] c 6 9
我想添加一个新的列z,包含按x的值分组的f(y,v)(让f(y,v)= mean(y)+ v)。请注意,我不想在
中打印或存储此计算的结果DT[,mean(y)+v,by=x]
x V1
[1,] a 4.333333
[2,] a 5.333333
[3,] a 6.333333
[4,] b 7.333333
[5,] b 8.333333
[6,] b 9.333333
[7,] c 10.333333
[8,] c 11.333333
[9,] c 12.333333
但我想将结果添加到DT:
x y v V1
[1,] a 1 1 4.333333
[2,] a 3 2 5.333333
[3,] a 6 3 6.333333
[4,] b 1 4 7.333333
[5,] b 3 5 8.333333
[6,] b 6 6 9.333333
[7,] c 1 7 10.333333
[8,] c 3 8 11.333333
[9,] c 6 9 12.333333
我的data.table有262 MB,这样
DT <- DT[,transform(.SD,mean(y)+v),by=x]
不是一个选项,因为我无法在内存中安装DT两次(我认为这是复制操作所暗示的)。事实是我从未见过这种操作完成。
我有什么替代方案(直到data.table附带DT [,z:= mean(y)+ v,by = x])?
我刚看过DT [newDT]。这有什么不对?
newDT <- DT[,mean(y)+v,by=x]
x V1
[1,] a 4.333333
[2,] a 5.333333
[3,] a 6.333333
[4,] b 7.333333
[5,] b 8.333333
[6,] b 9.333333
[7,] c 10.333333
[8,] c 11.333333
[9,] c 12.333333
(这是可行的记忆。)然后:
> DT[newDT]
setkey(DT,x)
setkey(newDT,x)
x y v V1
a 1 1 4.333333
a 3 2 4.333333
a 6 3 4.333333
a 1 1 5.333333
a 3 2 5.333333
a 6 3 5.333333
a 1 1 6.333333
a 3 2 6.333333
a 6 3 6.333333
b 1 4 7.333333
b 3 5 7.333333
b 6 6 7.333333
b 1 4 8.333333
b 3 5 8.333333
b 6 6 8.333333
b 1 4 9.333333
b 3 5 9.333333
b 6 6 9.333333
c 1 7 10.333333
c 3 8 10.333333
c 6 9 10.333333
c 1 7 11.333333
c 3 8 11.333333
c 6 9 11.333333
c 1 7 12.333333
c 3 8 12.333333
c 6 9 12.333333
但那不是我想要的。这里有什么错误?
答案 0 :(得分:4)
DT[, xm := ave(y, x, FUN=mean) + v]
答案 1 :(得分:3)
我会做以下事情:
DT[, list(fvy = mean(y)), by="x"][DT][, fvy := fvy + v]
基本上,我把它分成两部分:首先,我计算y
的平均值并将其添加到DT,然后我将v
添加到y
的平均值。记忆方面我不确定这是否真的有帮助,但作者很有可能看一看并让我们知道; - )
关于您的问题,为什么它不起作用:基本上,您最终会得到两个要合并的data.tables:DT
和newDT
。两个data.tables都有三次密钥。很明显,当你合并它们时,每个组合都在结果中,这就是你获得带有9 a,b和c的data.table的原因。
所以要按照你的方式去做,你需要第二把钥匙:
newDT <- DT[,list(fvy=mean(y)+v, v),by=x]
setkey(newDT, x, v)
setkey(DT, x, v)
DT[newDT]
x v y fvy
[1,] a 1 1 4.333333
[2,] a 2 3 5.333333
[3,] a 3 6 6.333333
[4,] b 4 1 7.333333
[5,] b 5 3 8.333333
[6,] b 6 6 9.333333
[7,] c 7 1 10.333333
[8,] c 8 3 11.333333
[9,] c 9 6 12.333333