2014-12-22 68 views
2

比方说,我有一组的,部分重叠的,间隔数随时间重叠的时间间隔

require(lubridate) 
date1 <- as.POSIXct("2000-03-08 01:59:59") 
date2 <- as.POSIXct("2001-02-29 12:00:00") 
date3 <- as.POSIXct("1999-03-08 01:59:59") 
date4 <- as.POSIXct("2002-02-29 12:00:00") 
date5 <- as.POSIXct("2000-03-08 01:59:59") 
date6 <- as.POSIXct("2004-02-29 12:00:00") 
int1 <- new_interval(date1, date2) 
int2 <- new_interval(date3, date4) 
int3 <- new_interval(date5, date6) 

有没有人有一个想法,一个如何能建立一个时间序列图,提供,对于每一个时间点,那个时候重叠的时间间隔的数量是多少?

举个例子,以上面的例子为例:对于2000年1月的给定日期,我要找的函数会返回值“1”(日期只在int2之内),而在2001年1月,它将返回“3”(因为该日期在int1,int2int3之内)。等

任何想法?

+0

IRanges包可能会有帮助。见[这里](http://stackoverflow.com/questions/15235821/merge-overlapping-ranges-into-unique-groups/15235901#15235901)和[这里](http://stackoverflow.com/questions/3916195/找到重叠范围与r)的开始。 – JasonAizkalns

回答

4

下面是使用foverlaps()功能使用data.table包的一种方法:

请通过以下的installation instructions是影响重叠连接上数字类型已经有固定的错误安装开发版本1.9.5。

require(data.table) ## 1.9.5+ 
intervals = data.table(start = c(date1, date3, date5), 
         end = c(date2, date4, date6)) 

# assuming your query is: 
query = as.POSIXct(c("2000-01-01 00:00:00", "2001-01-01 00:00:00")) 

我们将构建与查询data.table开始和结束的时间间隔,以及:

querydt = data.table(start=query, end=query) # identical start,end 

然后我们可以使用foverlaps()如下:

setkeyv(intervals, c("start", "end")) 
ans = foverlaps(querydt, intervals, which=TRUE, nomatch=0L, type="within") 
# xid yid 
# 1: 1 1 
# 2: 2 1 
# 3: 2 2 
# 4: 2 3 

我们第一个设置密钥 - 按提供的列将data.table intervals排序并将这些列标记为我们要执行重叠连接的关键列。

然后我们使用foverlaps()以找到在querydt重叠区间(下降类型=内)与intervals。在这种情况下,querydt仅由点组成,因为起点和终点相同。这将返回querydt中落在intervals范围内的所有匹配索引(nomatch = 0L删除所有没有匹配的行,哪些= TRUE返回索引而不是合并结果)。

现在我们要做的是xid聚集和计数观测次数,以获得数:

ans[, .N, by=xid] 
# xid N 
# 1: 1 1 
# 2: 2 3 

检查?foverlaps获取更多信息。

+0

在SO中的upvoting模式是惊人的 –