Eliminar filas basadas en una condición múltiples observaciones antes
He estado luchando por un tiempo ahora, y solo me falta un paso. Espero que puedas ayudar con este último paso.
Reprex
structure(list(record_id = c(110001, 110001, 110001, 110001,
110001, 110001, 110001, 110001, 110001, 110021, 110021, 110021,
110021, 110021, 110021, 110021, 110021, 110021, 110021, 110021,
110021, 110021), day_count = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 1,
2, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14), previous_treatment = c(0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0
), treatment = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0), interruption_streak = c(1, 2, 3, 4, 5,
6, 7, 8, 9, 1, 2, 3, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10)), row.names = c(NA,
-22L), groups = structure(list(record_id = c(110001, 110021),
.rows = structure(list(1:9, 10:22), ptype = integer(0), class = c("vctrs_list_of",
"vctrs_vctr", "list"))), row.names = c(NA, -2L), class = c("tbl_df",
"tbl", "data.frame"), .drop = TRUE), class = c("grouped_df",
"tbl_df", "tbl", "data.frame"))
Explicación
Este es solo un fragmento del conjunto de datos principal en el que he enumerado por participante y día cómo fueron tratados.
Aquí, puedes ver dos participantes de estudio record_id
110001 y 110021.
Para contar cuántos días se interrumpió su tratamiento, he creado una función de conteo interruption_streak
.
Esta función depende del valor de treatment
: si treatment
= 0, entonces comienza a contar hasta que treatment
> 0.
Tanto treatment
como previous_treatment
pueden ser 0 (sin tratamiento) o 1, 2, 3 (tratamiento A, B, C).
Sin embargo, como puedes ver en el record_id
110001, no puedes considerar la primera racha como una interrupción, ya que antes del día 1, no recibió ningún tratamiento (previous_treatment
= 0). Lo mismo ocurre con la primera racha de 110021.
La segunda racha de 110021 es la única válida que me gustaría considerar como una interrupción y mantener en el conjunto de datos: en el día 5, pasó de previous_treatment
= 1 a treatment
= 0.
Pregunta
Me gustaría eliminar todas las rachas que comenzaron con previous_treatment
= 0 y mantener todas las rachas que comenzaron con previous_treatment
> 0.
Muchas gracias de antemano.
davy.ai
Para eliminar todas las rachas que comenzaron con un
previous_treatment
= 0 y conservar todas las rachas que comenzaron con unprevious_treatment
> 0, podemos utilizar la funciónfilter()
del paquetedplyr
.Primero, necesitamos agrupar los datos por
record_id
y luego crear una nueva variable llamadastart_treatment
que indique el valor deprevious_treatment
en el primer día de cada racha:“`{r}
library(dplyr)
df <- df %>%
group_by(record_id) %>%
mutate(start_treatment = lag(treatment, default = -1))
Esto eliminará todas las rachas que comenzaron con un
previous_treatment
= 0 y conservará solo las rachas que comenzaron con unprevious_treatment
> 0.