Tengo un conjunto de datos de identificadores de eventos, el tipo de evento y la hora del evento. Los eventos constan de "inicio" y "pausa". Me gustaría identificar los eventos de "pausa" que no van seguidos de un evento de "inicio" dentro de los 7 días y clasificarlos como "paradas".
Aquí está el código para el conjunto de datos de prueba:
test <- data.frame("id" = 1:5,
"event" = c("pause",
"pause",
"start",
"pause",
"start"),
"time" = dmy("03-11-2012",
"05-11-2012",
"06-11-2012",
"21-11-2012",
"30-11-2012"))
Hasta ahora, usé lead () para verificar si el siguiente evento fue un evento de "inicio" Y sucedió dentro de los 7 días. Sin embargo, me di cuenta de que a veces un evento de "pausa" iba seguido de otro evento de "pausa" y luego un evento de "inicio", todo en 7 días. En este caso, ambos eventos de "pausa" no deben considerarse una parada. Esto significa que necesito verificar todos los eventos / filas que ocurrieron dentro de los 7 días posteriores al evento de "pausa" y buscar un evento de "inicio".
Estoy buscando una función que pueda usar dentro de dplyr (usaré soluciones que no sean de dplyr si tengo que hacerlo) donde pueda verificar el valor de varias filas.
Mi solución hasta ahora usando lead (), que verifica solo la siguiente fila inmediata.
test2 <- test %>%
mutate(stop = ifelse(event == "pause" &
!((time + days(7) > lead(time)) &
lead(event) == "start"),
"yes",
"no"))
Esto da
|id|event|time |stop|
|------------------------|
|1 |pause|2012-11-03|yes |
|2 |pause|2012-11-05|no |
|3 |start|2012-11-06|no |
|4 |pause|2012-11-21|yes |
|5 |start|2012-11-30|no |
Me gustaría que el valor de la columna de detención para la primera "pausa" también fuera un "no" porque tiene un evento de "inicio" dentro de los 7 días posteriores.
Si desea hacer esto dentro de una dplyr
función, puede sapply
dentro de un mutate
:
test %>%
mutate(stop = sapply(seq_along(time),
function(i) {
if(event[i] != "pause") return(FALSE)
ind <- which(time > time[i] & event == "start")
if(length(ind) == 0) return(FALSE)
as.numeric(difftime(time[ind[1]], time[i], units = "day")) > 7
}))
#> id event time stop
#> 1 1 pause 2012-11-03 FALSE
#> 2 2 pause 2012-11-05 FALSE
#> 3 3 start 2012-11-06 FALSE
#> 4 4 pause 2012-11-21 TRUE
#> 5 5 start 2012-11-30 FALSE
Este artículo se recopila de Internet, indique la fuente cuando se vuelva a imprimir.
En caso de infracción, por favor [email protected] Eliminar
Déjame decir algunas palabras