Mi marco de datos se ve así:

  test <-
    data.frame(
      id = c(4, 6, 9, 12, 14, 15),
      dates = seq(as.Date("2019-01-01"), as.Date("2019-01-06"), "days"),
      staus = c("REGULAR", "PENDING", "ANOTHER", "PENDING", "PENDING", "PENDING TOO")
    )

Lo que intento hacer es obtener el estado último PENDIENTE o PENDIENTE DEMASIADO, pero antes de otra fecha REGULAR / OTRA para el estado REGULAR o PENDIENTE.

En otras palabras, el resultado debe ser

  result <-
    data.frame(
      id = c(4, 6, 9, 12, 14, 15),
      dates = seq(as.Date("2019-01-01"), as.Date("2019-01-06"), "days"),
      staus = c("REGULAR", "PENDING", "ANOTHER", "PENDING", "PENDING", "PENDING TOO"),
      staus_summary = c("2019-01-02", NA, "2019-01-06", NA, NA, NA)
  )

Esto es lo que creé todavía, pero tengo un problema con la posibilidad de que no siempre esté el estado deseado en la siguiente fila.

  result <- test %>%
    mutate(
      status_summary = if_else(status %in% c("REGULAR", "ANOTHER") & lag(status) %in% c("PENDING", "PENDING TOO"), as.character(dates), NA_character_)
    )
1
Zcela Anonymní 6 oct. 2019 a las 17:35

1 respuesta

La mejor respuesta

Una forma sería crear un grupo en cada aparición de "REGULAR" o "ANOTHER" y reemplazar el primer valor del grupo con el valor last dates.

library(dplyr)

test %>%
  group_by(group = cumsum(staus %in% c("REGULAR", "ANOTHER"))) %>%
  mutate(staus_summary = as.Date(ifelse(row_number() == 1, 
                         last(dates), NA_real_))) %>%
  ungroup() %>%
  select(-group)

#     id dates      staus      staus_summary
#   <dbl> <date>     <fct>       <date>       
#1     4 2019-01-01 REGULAR     2019-01-02   
#2     6 2019-01-02 PENDING     NA           
#3     9 2019-01-03 ANOTHER     2019-01-06   
#4    12 2019-01-04 PENDING     NA           
#5    14 2019-01-05 PENDING     NA           
#6    15 2019-01-06 PENDING TOO NA           
1
Ronak Shah 6 oct. 2019 a las 14:50