假设我有一组部分重叠的间隔
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)
Run Code Online (Sandbox Code Playgroud)
有没有人知道如何构建一个时间序列图,为每个时间点提供该点重叠间隔的数量?
因此,例如,采用上面的例子:对于2000年1月的给定日期,我正在寻找的函数将返回值"1"(日期仅在其中int2),而对于2001年1月的日期,它将返回"3"(因为该日期在int1,int2并且int3).等等.
有任何想法吗?
这是foverlaps()使用data.table包的函数的一种方式:
请按照安装说明安装开发版本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"))
Run Code Online (Sandbox Code Playgroud)
我们还将构建包含开始和结束间隔的查询data.table:
querydt = data.table(start=query, end=query) # identical start,end
Run Code Online (Sandbox Code Playgroud)
然后我们可以使用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
Run Code Online (Sandbox Code Playgroud)
我们首先设置密钥 - intervals按提供的顺序对data.table 进行排序,并将这些列标记为我们要执行重叠连接的关键列.
然后我们foverlaps()用来找出querydt重叠的区间(瀑布类型=内)intervals.在这种情况下,querydt由起点和终点组成的点相同.这将返回所有匹配的索引(nomatch = 0L删除所有没有匹配的行,并且= TRUE返回索引而不是合并结果),这些行querydt落入其中intervals.
现在我们所要做的就是聚合xid并计算观察次数以获得计数:
ans[, .N, by=xid]
# xid N
# 1: 1 1
# 2: 2 3
Run Code Online (Sandbox Code Playgroud)
查看?foverlaps更多信息.