【问题标题】:Mutate columns "days passed after the event" based on a couple of event columns根据几个事件列改变列“事件发生后的天数”
【发布时间】:2019-03-04 18:29:18
【问题描述】:

我有数据集

      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 解决方案更可取。

【问题讨论】:

    标签: r dplyr tidyverse


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2022-08-15
      • 1970-01-01
      • 1970-01-01
      • 2010-10-19
      • 1970-01-01
      • 1970-01-01
      • 2021-11-15
      • 2020-02-18
      • 1970-01-01
      相关资源
      最近更新 更多