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.

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.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para eliminar todas las rachas que comenzaron con un previous_treatment = 0 y conservar todas las rachas que comenzaron con un previous_treatment > 0, podemos utilizar la función filter() del paquete dplyr.

    Primero, necesitamos agrupar los datos por record_id y luego crear una nueva variable llamada start_treatment que indique el valor de previous_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))


    El argumento `default = -1` en la función `lag()` establece el valor predeterminado para la primera fila de cada grupo en -1, ya que no hay fila anterior a la que hacer referencia. Ahora, podemos filtrar los datos para mantener solo las rachas que comenzaron con un `previous_treatment` > 0: ```{r} df <- df %>% filter(start_treatment > 0)

    Esto eliminará todas las rachas que comenzaron con un previous_treatment = 0 y conservará solo las rachas que comenzaron con un previous_treatment > 0.

Comments are closed.