根据几个事件列来更改“事件发生后的天数”列

时间:2019-03-04 18:29:18

标签: r dplyr tidyverse

我有数据集

      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 :(得分:1)

为此,我使用了dplyrzoo来实现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