【问题标题】:R create timeline of events using start / end dateR使用开始/结束日期创建事件时间表
【发布时间】:2015-04-30 19:50:30
【问题描述】:

我有一个包含许多事件(比如 1000 多个)的数据集,每个事件都有开始和结束日期。

ID  StartDate EndDate
1   1/1/2014  4/15/2014
2   2/3/2014  6/15/2014

等等。

我想在每个月底查看“系统中剩余的事件数”,比如条形图。

  1       2      2       1        1      0
Jan'14  Feb'14 Mar'14 April'14 May'15 June'15

我想取一个 hist(data$StartDate) 和 hist(data$EndDate) 并减去同月对应的存储桶。但我想如果有什么更简单的。

也欢迎任何更精美的图表,如累积移动平均线。

【问题讨论】:

    标签: r


    【解决方案1】:

    您可以通过使用lubridate 包来做到这一点。 我假设您也可以通过 base R 获得结果,但我想尝试lubridate 的间隔功能。

    library(lubridate)
    library(plyr)
    
    #create data
    df=data.frame(ID=c(1,2),
                  StartDate=as.Date(c("2014-01-01","2014-02-03")),
                  EndDate=as.Date(c("2014-04-15","2014-06-15")))
    
    #create list with datetime intervals for events
    event_interval_list=dlply(df,
                              "ID",
                              function(x) new_interval(x$StartDate,
                                                       x$EndDate,
                                                       tz="UTC")
                              )
    
    #this is the eom day at 00:00:00
    eom_day_vector_1=with_tz(as.POSIXct(seq(as.Date("2014-02-01"),
                                            as.Date("2014-07-01"),
                                            "month")-days(1)
                                        ),
                             "UTC")
    #this is the eom day at 23:59:59
    eom_day_vector_2=with_tz(as.POSIXct(seq(as.Date("2014-02-01"),
                                            as.Date("2014-07-01"),
                                            "month")-seconds(1)
                                        ),
                             "UTC")
    
    #this is a list with all eom datetime ranges
    eom_intervals=Map(function(x,y) interval(x,y),
                      eom_day_vector_1,
                      eom_day_vector_2)
    
    #see whether there is an overlap of a given event interval...
    #...with any eom datetime range
    event_count=colSums(ldply(event_interval_list,function(x) !is.na(sapply(eom_intervals,function(y) intersect(x,y))))[-1])
    
    #prepare result
    res=data.frame(mth_yr=strftime(eom_day_vector_1,format="%m-%y"),
                   event_count=event_count)
    rownames(res)=NULL
    
    #print result
    res
    
    # mth_yr event_count
    #1 01-14           1
    #2 02-14           2
    #3 03-14           2
    #4 04-14           1
    #5 05-14           1
    #6 06-14           0
    

    【讨论】:

    • 不幸的是,lubridate 不允许 Date 范围,而只允许 POSIX* 或日期时间范围。使用简单的Date 范围,这种方法会更短。
    猜你喜欢
    • 2012-01-14
    • 1970-01-01
    • 2021-06-20
    • 1970-01-01
    • 1970-01-01
    • 2020-10-26
    • 1970-01-01
    • 1970-01-01
    • 2018-10-16
    相关资源
    最近更新 更多