我们说我有一组部分重叠的间隔
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; (因为该日期在int1
,int2
和int3
之内。等
有什么想法吗?
答案 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返回索引而不是合并结果)intervals
中xid
内的行。{/ p>
现在我们所要做的就是按ans[, .N, by=xid]
# xid N
# 1: 1 1
# 2: 2 3
汇总并计算观察次数以获得计数:
?foverlaps
查看{{1}}了解详情。