8

我正在寻找尚未实施的(据我所知)分配的最佳替代方案,按组在 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

但这不是我想要的。这里有什么错误?

4

2 回答 2

4
DT[, xm := ave(y, x, FUN=mean) + v]
于 2012-05-24T03:27:02.913 回答
3

我会做以下事情:

DT[, list(fvy = mean(y)), by="x"][DT][, fvy := fvy + v]

所以基本上,我把它分成两部分:首先,我计算 的平均值y并将其添加到 DT,然后我添加v到 的平均值y。记忆方面,我不确定这是否真的有帮助,但作者很有可能会看看并让我们知道;-)

关于您的问题为什么它不起作用:基本上,您最终会得到两个要合并的 data.tables:DTnewDT. 两个 data.tables 每个键都有 3 次。所以很明显,当你合并它们时,每个组合都在结果中,这就是你得到一个包含 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
于 2012-05-24T07:18:12.570 回答