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.

Recodificar la variable de tiempo basándose en el valor de otra columna.

Tengo una variable time que quiero reprogramar según el cambio de evento en otra columna. Específicamente, si el valor de y cambia de 1 a 0, el time comenzará de nuevo desde 0. También necesito que esta actualización se realice dentro del mismo individuo (es decir, ordenado por id). La longitud total de tiempo puede ser diferente entre los individuos. Aquí está el conjunto de datos original:

df <- data.frame(id = rep(1:3, c(5,6,7)), time = c(seq(from = 0, to = 2000, by = 500), seq(from = 0, to = 2500, by = 500), seq(from = 0, to = 3000, by = 500)), y = c(0,0,1,0,0,0,0,1,1,0,1,0,1,1,0,1,1,0))
df
   id time y
1   1    0 0
2   1  500 0
3   1 1000 1
4   1 1500 0
5   1 2000 0
6   2    0 0
7   2  500 0
8   2 1000 1
9   2 1500 1
10  2 2000 0
11  2 2500 1
12  3    0 0
13  3  500 1
14  3 1000 1
15  3 1500 0
16  3 2000 1
17  3 2500 1
18  3 3000 0

El resultado final debería verse así (observa la actualización de tiempo en las filas 4, 10, 15 y 18. Las longitudes de tiempo también son diferentes entre los tres individuos):

   id time y
1   1    0 0
2   1  500 0
3   1 1000 1
4   1    0 0
5   1  500 0
6   2    0 0
7   2  500 0
8   2 1000 1
9   2 1500 1
10  2    0 0
11  2  500 1
12  3    0 0
13  3  500 1
14  3 1000 1
15  3    0 0
16  3  500 1
17  3 1000 1
18  3    0 0

¿Cómo lograr esto? ¡Gracias!

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Podemos lograr esto utilizando el paquete dplyr en R.

    Primero, agrupamos los datos por id y luego creamos una nueva columna evento que utiliza la función lag() para verificar cualquier cambio en la columna y. Si hay un cambio (es decir, el valor anterior de y es 1 y el valor actual es 0), lo etiquetamos como un nuevo evento y asignamos un nuevo número de evento (cumsum del vector lógico). De lo contrario, conservamos la etiqueta de evento anterior.

    Finalmente, agrupamos los datos por id y evento y utilizamos la función cumsum() para volver a codificar la columna tiempo basada en el evento. Restamos el valor mínimo de tiempo para cada evento para comenzar el tiempo desde 0 para cada evento.

    Aquí está el código para lograr esto:

    library(dplyr)
    
    df %>%
      group_by(id) %>%
      mutate(evento = cumsum(lag(y == 1 & lag(y) == 0, default = FALSE))) %>%
      group_by(id, evento) %>%
      mutate(tiempo = tiempo - min(tiempo)) %>%
      ungroup() %>%
      select(id, tiempo, y)
    

    Esto producirá el resultado deseado como se muestra a continuación:

    “`

    A tibble: 18 x 3

      id  tiempo     y
    


    1 1 0 0
    2 1 500 0
    3 1 1000 1
    4 1 0 0
    5 1 500 0
    6 2 0 0
    7 2 500 0
    8 2 1000 1
    9 2 1500 1
    10 2 0 0
    11 2 500 1
    12 3 0 0
    13 3 500 1
    14 3 1000 1
    15 3 0 0
    16 3 500 1
    17 3 1000 1
    18 3 0 0
    “`

Comments are closed.