Quiero "recorrer" las filas de un data.table y calcular un promedio para cada fila. El promedio se debe calcular sobre la base del siguiente mecanismo:"Loop through" data.table para calcular promedios condicionales
- Busque el identificador ID en la fila i (ID (i))
- buscar el valor de T2 en la fila i (T2 (i))
- Calcular la media de los valores de
Data1
en todas las filasj
, que cumplen estos dos criterios:ID(j) = ID(i)
yT1(j) = T2(i)
Introduzca el promedio calculado en el Datos2 columna de la fila i
DF = data.frame(ID=rep(c("a","b"),each=6), T1=rep(1:2,each=3), T2=c(1,2,3), Data1=c(1:12)) DT = data.table(DF) DT[ , Data2:=NA_real_] ID T1 T2 Data1 Data2 [1,] a 1 1 1 NA [2,] a 1 2 2 NA [3,] a 1 3 3 NA [4,] a 2 1 4 NA [5,] a 2 2 5 NA [6,] a 2 3 6 NA [7,] b 1 1 7 NA [8,] b 1 2 8 NA [9,] b 1 3 9 NA [10,] b 2 1 10 NA [11,] b 2 2 11 NA [12,] b 2 3 12 NA
Para este sencillo ejemplo, el resultado debe ser similar a esto:
ID T1 T2 Data1 Data2
[1,] a 1 1 1 2
[2,] a 1 2 2 5
[3,] a 1 3 3 NA
[4,] a 2 1 4 2
[5,] a 2 2 5 5
[6,] a 2 3 6 NA
[7,] b 1 1 7 8
[8,] b 1 2 8 11
[9,] b 1 3 9 NA
[10,] b 2 1 10 8
[11,] b 2 2 11 11
[12,] b 2 3 12 NA
Creo que una manera de hacer esto sería colocar a través de las filas, pero creo que es ineficiente. He echado un vistazo a la función apply()
, pero estoy seguro de que resolvería mi problema. También podría usar data.frame
en lugar de data.table
si esto lo hace mucho más eficiente o más fácil. El conjunto de datos real contiene aproximadamente 1 millón de filas.
La especificación escrita parece difícil de poner en práctica, pero su ejemplo sugiere que dentro de cada grupo de ID desea los medios de algún grupo de valores para el cual T2 está en el rango de valores de T1. Pero incluso esa interpretación se desmorona cuando intentamos averiguar por qué Data2 en la segunda fila debería ser 5. ????? –
@DWin eso se debe a que el promedio se realiza en la columna 'Data1'. 'Data2 [2]' es igual a 5 porque 5 es el promedio de '(4, 5, 6)'. – ulidtko