2016-03-01 178 views
3
在數據表計數以前行

(道歉,如果這裏的一些術語的關閉 - 我來自一個SQL後臺,我纔剛剛進入將R世界)基於日期

我有一個數據錶帶有一系列按日期排序的條目。數據表中的一個字段是分組值,一個是時間值。 隨着數據排序(或鍵入 - 我是R新手,但仍然不能確定其中的差異),那麼我希望計算每行的這個組中多少行如何排在當前行的前面(包括在給定的時間範圍內。

這裏是我想要做的,使用火炬松數據集一個簡單的例子:

躍躍欲試示例數據:

library(lubridate) 
library(zoo) 
library(data.table) 
DT = as.data.table(Loblolly) 
DT[,rd := Sys.time() + years(age)] 
setkey(DT,Seed,rd) 

現在我們必須通過種子排序數據表(組)和rd(我的日期欄)。我有將產生我的計數值(CT)的基礎上爲10年的時間間隔中的溶液:

DT[,.ct:=mapply(function(x,y) DT[(rd>x-years(10) & rd<=x &Seed==y),.N],DT$rd,DT$Seed)] 

這產生所希望的結果在這個例子中數據集:

height age Seed     rd ct 
1: 3.93 3 329 2019-03-01 13:38:00 1 
2: 9.34 5 329 2021-03-01 13:38:00 2 
3: 26.08 10 329 2026-03-01 13:38:00 3 
4: 37.79 15 329 2031-03-01 13:38:00 2 
5: 48.31 20 329 2036-03-01 13:38:00 2 
6: 56.43 25 329 2041-03-01 13:38:00 2 
7: 4.12 3 327 2019-03-01 13:38:00 1 
8: 9.92 5 327 2021-03-01 13:38:00 2 
9: 26.54 10 327 2026-03-01 13:38:00 3 
10: 37.82 15 327 2031-03-01 13:38:00 2 
... 
... 

然而,我需要將這個規模擴大到大約10,000個團隊的500萬條記錄,並且在那裏運行需要很長的時間。有沒有更快,更笨拙的方法來做我想做的事情?

回答

3

以下是使用data.table::foverlaps的可能解決方案。這裏的想法是首先加入{Sys.time() - years(10), Sys.time() + years(age)}的整個範圍。然後,只計算差異小於< = 10年的情況。

DT <- as.data.table(Loblolly) 
DT[, c("rd", "rd2") := Sys.time() + years(age)] # create identical columns so foverlaps will work 
setkey(DT, Seed, rd, rd2) # key by all for same reason 
DT2 <- DT[, .(Seed, rd = rd - years(10), rd2, indx = .I)] # create minum range, create index to store row number 
DT[, ct := foverlaps(DT, DT2)[i.rd > rd, .N, by = indx]$N] # run foverlaps, subset by condition and count 
head(DT, 10) 
#  height age Seed     rd     rd2 ct 
# 1: 3.93 3 329 2019-03-01 22:59:02 2019-03-01 22:59:02 1 
# 2: 9.34 5 329 2021-03-01 22:59:02 2021-03-01 22:59:02 2 
# 3: 26.08 10 329 2026-03-01 22:59:02 2026-03-01 22:59:02 3 
# 4: 37.79 15 329 2031-03-01 22:59:02 2031-03-01 22:59:02 2 
# 5: 48.31 20 329 2036-03-01 22:59:02 2036-03-01 22:59:02 2 
# 6: 56.43 25 329 2041-03-01 22:59:02 2041-03-01 22:59:02 2 
# 7: 4.12 3 327 2019-03-01 22:59:02 2019-03-01 22:59:02 1 
# 8: 9.92 5 327 2021-03-01 22:59:02 2021-03-01 22:59:02 2 
# 9: 26.54 10 327 2026-03-01 22:59:02 2026-03-01 22:59:02 3 
# 10: 37.82 15 327 2031-03-01 22:59:02 2031-03-01 22:59:02 2 
+0

這出色的作品約100,000行,但是在1萬元及以上的內存使用氣球較快(工作集爲14GB) - 我認爲,因爲R爲foverlaps中創建一個非常大的中間數據結構。 有沒有一種方法可以避免這種情況?是否有可能以某種方式循環組? – TimBrown

+0

是的,我很害怕這個......這是因爲我完全加入了。我想這個解決方案你需要一個大內存,或者等待別人有更好的解決方案。 –