Calculando la reducción entre todas las columnas de series temporales para cada fila en R.
Intento crear un data.frame que muestre la reducción entre todas las columnas de series de tiempo para cada fila en R. Solo quiero capturar la diferencia negativa (reducción) y establecer la diferencia positiva en cero.
Para ilustrar esto, creé df1 como punto de partida e intento lograr df2.
biblioteca(data.table)
df1 = data.table(
ID = c("a1", "a2", "a3", "a4", "a5", "a6", "a7"),
"string1" = c("x2", "g3", "n2", "m3", "2w", "ps2", "kg2"),
"2018" = c(3,5,11,3,9,22,6),
"2019" = c(3,5,6,21,1,4,0),
"2020" = c(0,4,13,9,16,7,9),
"2021" = c(4,0,3,8,5,4,6),
"string2" = c("si", "q2", "oq", "mx", "ix", "p2", "2q"))
ID string1 2018 2019 2020 2021 string2
1: a1 x2 3 3 0 4 si
2: a2 g3 5 5 4 0 q2
3: a3 n2 11 6 13 3 oq
4: a4 m3 3 21 9 8 mx
5: a5 2w 9 1 16 5 ix
6: a6 ps2 22 4 7 4 p2
7: a7 kg2 6 0 9 6 2q
df2 = data.table(
ID = c("a1", "a2", "a3", "a4", "a5", "a6", "a7"),
"string1" = c("x2", "g3", "n2", "m3", "2w", "ps2", "kg2"),
"2018" = c(0,0,0,0,0,0,0),
"2019" = c(0,0,5,0,8,18,6),
"2020" = c(3,1,0,12,0,0,0),
"2021" = c(0,4,10,1,11,3,3),
"string2" = c("si", "q2", "oq", "mx", "ix", "p2", "2q"))
ID string1 2018 2019 2020 2021 string2
1: a1 x2 0 0 3 0 si
2: a2 g3 0 0 1 4 q2
3: a3 n2 0 5 0 10 oq
4: a4 m3 0 0 12 1 mx
5: a5 2w 0 8 0 11 ix
6: a6 ps2 0 18 0 3 p2
7: a7 kg2 0 6 0 3 2q
¿Existe una forma más eficiente que iterar con un bucle for?
¡Muchas gracias!
davy.ai
Sí, hay una forma más eficiente que iterar con un bucle for. Puedes utilizar la función
diff
en R para calcular la diferencia entre cada columna de la serie temporal para cada fila. Luego puedes utilizar la funciónifelse
para establecer la diferencia positiva en cero y mantener la diferencia negativa.Por ejemplo, puedes utilizar el siguiente código para lograr el resultado deseado:
df2 = df1
df2[, (2:6) := lapply(.SD, function(x) ifelse(diff(x) > 0, 0, diff(x)))]
Este código calculará la diferencia entre cada columna de la serie temporal para cada fila y establecerá la diferencia positiva en cero.