Изменять столбцы «дней прошло после события» на основе пары столбцов событий - PullRequest
0 голосов
/ 04 марта 2019

У меня есть набор данных

      Date    event_1    event_2    ...    event_n
2019-01-01         18          0                 2
2019-01-02         21          0                 2
2019-01-03          0         22                 2
2019-01-04          0         33                 0
2019-01-05          0          1                 2
2019-01-06          0          0                 1
2019-01-07          0          0                 0
2019-01-08          0          0                 0
       ...        ...        ...               ...

События имеют несколько двойных значений.Там, где нет события, он равен 0. Мне нужно изменить отдельный столбец для каждого столбца события, который выглядит так:

     Date    event_1    event_2    ...    event_n    ...    days_since_event_1    days_since_event_2    ...    days_since_event_n
2019-01-01         18          0                 2                           0                    NA                            0
2019-01-02         21          0                 2                           0                    NA                            0
2019-01-03          0         22                 2                           1                     0                            0
2019-01-04          0         33                 0                           2                     0                            1
2019-01-05          0          1                 2                           3                     0                            0
2019-01-06          0          0                 1                           4                     1                            0
2019-01-07          0          0                 0                           5                     2                            1
2019-01-08          0          0                 0                           6                     3                            1
   ...        ...        ...               ...

И для каждого этого столбца мне нужно заполнить значения днями, прошедшими после определенного события.Tidyverse решение является предпочтительным.

1 Ответ

0 голосов
/ 04 марта 2019

Чтобы ответить на этот вопрос, я использовал 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
...