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.

Calcular el intervalo de tiempo hasta la primera medición dentro de los sujetos utilizando group_by().

Tengo un dataframe en formato largo con sujetos que se observan varias veces:

dat1 <- tribble(
  ~CODE, ~V1, ~V2, ~session, ~date,
  "1111P11", 2, 3, 1, "2020-09-01",
  "1111P11", 3, 2, 2, "2020-09-08",
  "1111P11", 1, 3, 3, "2020-09-15",
  "1111P11", 3, 4, 4, "2020-09-25",
  "2222P22", 5, 1, 1, "2020-05-15",
  "2222P22", 3, 2, 2, "2020-05-22",
  "2222P22", 1, 4, 3, "2020-05-30",
  "3333P33", 3, 4, 1, "2020-06-10",
  "3333P33", 4, 1, 2, "2020-06-17",
  "3333P33", 3, 5, 3, "2020-06-24", 
  "3333P33", 4, 2, 4, "2020-07-01",
  "3333P33", 3, 4, 5, "2020-07-10"
)
dat1$date <- as.Date(dat$date)

Me gustaría calcular, para cada sujeto, el intervalo de tiempo entre cada sesión y la primera sesión, lo que debería resultar en esto:

dat2 <- tribble(
  ~CODE, ~V1, ~V2, ~session, ~date, ~interv.1st.sess,
  "1111P11", 2, 3, 1, "2020-09-01", 0,
  "1111P11", 3, 2, 2, "2020-09-08", 7,
  "1111P11", 1, 3, 3, "2020-09-15", 14, 
  "1111P11", 3, 4, 4, "2020-09-25", 24,
  "2222P22", 5, 1, 1, "2020-05-15", 0,
  "2222P22", 3, 2, 2, "2020-05-22", 7,
  "2222P22", 1, 4, 3, "2020-05-30", 15,
  "3333P33", 3, 4, 1, "2020-06-10", 0,
  "3333P33", 4, 1, 2, "2020-06-17", 7,
  "3333P33", 3, 5, 3, "2020-06-24", 14,
  "3333P33", 4, 2, 4, "2020-07-01", 21,
  "3333P33", 3, 4, 5, "2020-07-10", 30
)

He estado tratando de resolver esto de alguna manera con group_by(), pero no tuve éxito. ¿Hay alguna manera de hacer esto en tidyverse (u otra forma)?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Sí, puedes usar la función group_by() de dplyr y mutate() para crear una nueva columna con el intervalo entre cada sesión y la primera sesión para cada sujeto. Aquí está el código:

    library(dplyr)
    library(lubridate)
    
    dat2 <- dat1 %>%
      group_by(CODE) %>%
      mutate(interv.1st.sess = as.numeric(difftime(date, min(date)))) %>%
      ungroup()
    
    dat2
    

    Explicación:

    1. Primero, usamos group_by(CODE) para agrupar los datos por sujeto.
    2. Luego, usamos mutate() para crear una nueva columna llamada interv.1st.sess y asignarle el valor de la diferencia (en días) entre la fecha de cada sesión y la fecha de la primera sesión para cada sujeto. Usamos as.numeric() para convertir la diferencia de tiempo resultante a un número.
    3. Por último, usamos ungroup() para quitar la agrupación y así los datos están en su orden original.

    Esto debería darte el resultado deseado en dat2. Ten en cuenta que usamos la función date() de lubridate para convertir la columna de fecha a un formato de fecha adecuado antes de calcular las diferencias de tiempo.

Comments are closed.