我有数据集
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解决方案是首选。
答案 0 :(得分:1)
为此,我使用了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