首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >R使用开始/结束日期创建事件的时间表

R使用开始/结束日期创建事件的时间表
EN

Stack Overflow用户
提问于 2015-05-01 03:50:31
回答 1查看 914关注 0票数 1

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

代码语言:javascript
运行
复制
ID  StartDate EndDate
1   1/1/2014  4/15/2014
2   2/3/2014  6/15/2014

诸若此类。

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

代码语言:javascript
运行
复制
  1       2      2       1        1      0
Jan'14  Feb'14 Mar'14 April'14 May'15 June'15

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

此外,也欢迎任何更花哨的图表,如累积移动平均。

EN

回答 1

Stack Overflow用户

发布于 2015-05-01 07:06:28

您可以使用lubridate包来完成此操作。我假设您也可以通过基数R获得结果,但我想尝试一下lubridate的interval功能。

代码语言:javascript
运行
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29976571

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档