привести, где строка равна - PullRequest
1 голос
/ 06 октября 2019

мой фрейм данных выглядит следующим образом:

  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")
    )

Я пытаюсь получить статус последний PENDING или PENDING TOO, но перед другой РЕГУЛЯРНОЙ / ДРУГОЙ датой для статуса REGULARили В ОЖИДАНИИ.

Другими словами, результат должен быть

  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)
  )

Вот то, что я создал, но у меня есть проблема с возможностью того, что не всегда желаемый статус только в следующей строке.

  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 Ответ

1 голос
/ 06 октября 2019

Один из способов - создать группу при каждом появлении "REGULAR" или "ANOTHER" и заменить первое значение в группе значением 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           
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...