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

x の値でグループ化された f(y,v) を含む新しい列 z を追加したいと思います (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 をメモリに 2 回格納できないため、これはオプションではありません (これはコピー操作によって暗示されていると思います)。実際、私はその作戦が終了したのを見たことがありません。

どのような選択肢がありますか (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]

基本的に、私はそれを 2 つの部分に分割します。まず、 の平均を計算してyそれを DT に追加vし、次に の平均に追加しyます。メモリに関しては、これが本当に役立つかどうかはわかりませんが、作者が見て知らせてくれる可能性は十分にあります;-)

なぜそれが機能しないのかという質問について: 基本的に、マージしたい 2 つの data.tables:DTnewDT. 両方の data.table には、すべてのキーが 3 回あります。明らかに、それらをマージすると、すべての組み合わせが結果に含まれるため、9 つの a、b、および c を持つ data.table が得られます。

したがって、私の方法と非常によく似た方法でそれを行うには、2番目のキーが必要です。

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 に答える