Чтобы ответить на этот вопрос, я использовал dplyr
, но также zoo
для функции na.locf()
.
Мы используем mutate_at()
для циклического перебора каждой переменной, начинающейся с 'event'.Так как это завершает наше новое имя до конца, мы используем rename_at()
, чтобы присвоить имя так, как оно было у вас.
data %>%
mutate_at(vars(starts_with("event")), funs(days_since = as.numeric(Date - na.locf(ifelse(. > 0, Date, NA), na.rm = FALSE)))) %>%
rename_at(vars(ends_with("_days_since")), funs(paste("days_since", gsub("_days_since", "", .), sep = "_")))
Date event_1 event_2 event_n days_since_event_1 days_since_event_2 days_since_event_n
<date> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 2019-01-01 18 0 2 0 NA 0
2 2019-01-02 21 0 2 0 NA 0
3 2019-01-03 0 22 2 1 0 0
4 2019-01-04 0 33 0 2 0 1
5 2019-01-05 0 1 2 3 0 0
6 2019-01-06 0 0 1 4 1 0
7 2019-01-07 0 0 0 5 2 1
8 2019-01-08 0 0 0 6 3 2