Estoy buscando la mejor alternativa a la asignación aún no implementada (que yo sepa) por referencia en un data.table por grupos. Usando el ejemplo data.table,data.table alternativa eficiente a la asignación agrupada como DT [, x: = f (y), by = z]?
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
Quiero añadir un nuevo z columna, que contiene f (y, v) agrupados por valores de x (permite echar f (y, v) = media (y) + v). Tenga en cuenta que no quiero imprimir o almacenar el resultado de este cálculo como en
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
sino más bien quiero añadir el resultado a 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
mi data.table tiene 262 MB, de tal manera que
DT <- DT[,transform(.SD,mean(y)+v),by=x]
no es una opción, ya que no puedo encajar DT dos veces en la memoria (que está implícito en la operación de copia, creo). El hecho es que nunca he visto terminar esa operación.
¿Qué alternativas tengo (hasta que data.table viene con DT [, z: = mean (y) + v, by = x])?
Acabo de leer sobre DT [newDT]. ¿Qué pasa aquí?
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
(que es la memoria factible sabia.) A continuación:
> 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
pero eso no es lo que quiero. ¿Cuál es el error aquí?
+1 Muy buena pregunta! –