es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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!

Tags:  , ,

Answer

  1. Avatar for 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ón ifelse 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.

Comments are closed.