2014-12-22 88 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模式是驚人的 –