我有一个包含许多事件(比如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(数据$StartDate)和hist(数据$EndDate),然后减去与同一个月对应的存储桶。但我想如果有什么更简单的。
此外,也欢迎任何更花哨的图表,如累积移动平均。
发布于 2015-05-01 07:06:28
您可以使用lubridate包来完成此操作。我假设您也可以通过基数R获得结果,但我想尝试一下lubridate的interval功能。
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 0https://stackoverflow.com/questions/29976571
复制相似问题