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!
davy.ai
Podemos lograr esto utilizando el paquete dplyr en R.
Primero, agrupamos los datos por
id
y luego creamos una nueva columnaevento
que utiliza la funciónlag()
para verificar cualquier cambio en la columnay
. Si hay un cambio (es decir, el valor anterior dey
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
yevento
y utilizamos la funcióncumsum()
para volver a codificar la columnatiempo
basada en el evento. Restamos el valor mínimo detiempo
para cada evento para comenzar el tiempo desde 0 para cada evento.Aquí está el código para lograr esto:
Esto producirá el resultado deseado como se muestra a continuación:
“`
A tibble: 18 x 3
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
“`