data.table эффективная альтернатива групповому присвоению как DT[ ,x:=f(y),by=z]?

Я ищу лучшую альтернативу еще не реализованному ( насколько мне известно) назначение по ссылке в 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, содержащий f(y,v), сгруппированный по значениям x (возьмем 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

мои данные .table имеет 262 МБ, так что

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

но это не то, что я хочу. В чем здесь ошибка?

8
задан Florian Oswald 24 May 2012 в 01:00
поделиться