随时间变化的重叠间隔数

时间:2014-12-22 15:55:00

标签: r lubridate

我们说我有一组部分重叠的间隔

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月的给定日期,我正在寻找的函数将返回值&#34; 1&#34; (日期仅在int2),而对于2001年1月的日期,它将返回&#34; 3&#34; (因为该日期在int1int2int3之内。等

有什么想法吗?

1 个答案:

答案 0 :(得分:5)

使用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只包含点,因为起点和终点是相同的。这将返回所有匹配的索引(nomatch = 0L删除所有没有匹配的行,并且= TRUE返回索引而不是合并结果)intervalsxid内的行。{/ p>

现在我们所要做的就是按ans[, .N, by=xid] # xid N # 1: 1 1 # 2: 2 3 汇总并计算观察次数以获得计数:

?foverlaps

查看{{1}}了解详情。