【问题标题】:Calculate time duration between different events计算不同事件之间的持续时间
【发布时间】:2018-06-08 14:19:03
【问题描述】:

我有一个数据集:

here_dat <- '
ID,Event,Date
1,Pre-trans,01-01-2018
1,Event1 start,09-01-2018
1,Trans,19-01-2018
1,Trans,09-01-2018
1,Event1 end,19-01-2018
1,Post-trans,20-01-2018
1,Event2 start,21-01-2018
1,Trans,22-01-2018
1,Trans,23-01-2018
2,Pre-trans,01-01-2018
2,Event1 start,07-01-2018
3,Pre-trans,01-01-2018
3,Event2 start,09-01-2018
3,Trans,11-01-2018
3,Trans,13-01-2018
3,Trans,14-01-2018
3,Trans,17-01-2018
3,Event2 end,19-01-2018
3,Event1 start,25-01-2018
3,Event1 end,27-02-2018
'
events <- read.table(text=here_dat, sep=",", header=TRUE, stringsAsFactors=FALSE)
  1. 有两种类型的事件:Event1 和 Event2
  2. Event1 开始/结束不会与 Event2 开始/结束重叠
  3. 活动可能没有结束日期

我想计算每个 ID 的每种类型的事件之间的持续时间。如果事件没有结束日期,则使用当前日期作为结束日期。

理想的输出:

ID Event.type Event.startDate Duration
1 Event1 09-01-2018 10
1 Event2 21-01-2018 138
2 Event1 07-01-2018 152
3 Event2 09-01-2018 10
3 Event1 25-01-2018 2

【问题讨论】:

    标签: r


    【解决方案1】:

    你可以试试

    library(tidyverse) 
    events %>% 
      as.tibble() %>% 
      mutate(Date=as.Date(Date, format="%d-%m-%Y")) %>% 
      separate(Event, letters[1:2], sep=" ") %>% 
      filter(grepl("Event", a)) %>% 
      spread(b, Date) %>% 
      mutate(Duration=ifelse(is.na(end), Sys.Date() - start, end- start))
    # A tibble: 5 x 5
         ID a      end        start      Duration
      <int> <chr>  <date>     <date>        <dbl>
    1     1 Event1 2018-01-19 2018-01-09       10
    2     1 Event2 NA         2018-01-21      138
    3     2 Event1 NA         2018-01-07      152
    4     3 Event1 2018-02-27 2018-01-25       33
    5     3 Event2 2018-01-19 2018-01-09       10
    

    这个想法是传播开始和结束以轻松减去两个日期。在这里,我们可以使用tidyverse 函数来转换DateEvent 列。然后 separatefilter 用于“事件”,最后是 spread

    【讨论】:

      猜你喜欢
      • 2019-01-16
      • 2019-07-21
      • 1970-01-01
      • 1970-01-01
      • 2018-08-27
      • 2015-03-13
      • 2016-09-10
      • 2018-03-04
      • 1970-01-01
      相关资源
      最近更新 更多