簡體   English   中英

R:在分組條件下聚合大數據幀

[英]R: Aggregating Large Data Frame under a Grouping Condition

我正在嘗試找出最快的方式來聚合類似於以下內容的大數據幀(約5000萬行):

>sample_frame = data.frame("id" = rep(sample(1:100,2,replace=F),3),
+ "date" = sample(seq(as.Date("2014-01-01"),as.Date("2014-02-13"),by=1),6),
+ "value" = runif(6))
> sample_frame
  id       date      value
1 73 2014-02-11 0.84197491
2  7 2014-01-14 0.08057893
3 73 2014-01-16 0.78521616
4  7 2014-01-24 0.61889286
5 73 2014-02-06 0.54792356
6  7 2014-01-06 0.66484848

在這里,我們有2個具有3個日期的唯一ID,並為每個ID分配了一個值。 我知道我可以使用ddply或data.table或僅使用lapply來聚合並找到每個ID的均值。

我真正要尋找的是一種快速找到最近兩個日期的每個ID均值的方法。 例如,使用sapply:

> sapply(split(sample_frame,sample_frame$id),function(x){
+   mean(x$value[x$date%in%x$date[order(x$date,decreasing=T)][1:2]])
+ })
        7        73 
0.3497359 0.6949492

我不知道如何獲取data.table來做到這一點。 思考? 提示?

為什么不在您的“ data.table”聚合步驟中使用tail

set.seed(1)
sample_frame = data.frame("id" = rep(sample(1:100,2,replace=F),3),
                          "date" = sample(seq(as.Date("2014-01-01"),
                                              as.Date("2014-02-13"),by=1),6),
                          "value" = runif(6))

DT <- data.table(sample_frame, key = "id,date")
DT
#    id       date      value
# 1: 27 2014-01-09 0.20597457
# 2: 27 2014-01-26 0.62911404
# 3: 27 2014-02-07 0.68702285
# 4: 37 2014-02-06 0.17655675
# 5: 37 2014-02-09 0.06178627
# 6: 37 2014-02-13 0.38410372
DT[, mean(tail(value, 2)), by = id]
#    id        V1
# 1: 27 0.6580684
# 2: 37 0.2229450

由於您只需要兩個值的均值,因此可以直接進行操作(無需使用mean )。 而且,您可以使用內部變量.N而不是tail來提高速度。 您只需要照顧只有1個約會的情況。 基本上,這應該快得多。

DT[, (value[.N]+value[max(1L, .N-1)])/2, by=id]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM