2015-05-11 139 views
4

作爲一個例子,我有data.table如下所示。我想做一個簡單的聚合,其中b = sum(b)。對於c,但是我想要b中最大的記錄值。所需的輸出如下所示(data.aggr)。這導致了幾個問題:R數據彙總與組WHERE子句

1)有沒有辦法做到這一點data.table?

2)有沒有更簡單的方法在plyr中做到這一點?

3)在plyr中,輸出對象從data.table變爲data.frame。我可以避免這種行爲嗎?

library(plyr) 
library(data.table) 
dt <- data.table(a=c('a', 'a', 'a', 'b', 'b'), b=c(1, 2, 3, 4, 5), 
       c=c('m', 'n', 'p', 'q', 'r')) 
dt 
# a b c 
# 1: a 1 m 
# 2: a 2 n 
# 3: a 3 p 
# 4: b 4 q 
# 5: b 5 r 
dt.split <- split(dt, dt$a) 
dt.aggr <- ldply(lapply(dt.split, 
    FUN=function(dt){ dt[, .(b=sum(b), c=dt[b==max(b), c]), 
    by=.(a)] }), .id='a') 
dt.aggr 
# a b c 
# 1 a 6 p 
# 2 b 9 r 
class(dt.aggr) 
# [1] "data.frame" 
+2

爲什麼你會使用'plyr'在'data.table': - Ø? – Arun

+1

如果你讓你的代碼可以複製 - 也就是說,在每行的開始處沒有'>'或'+',這很好。 – Frank

+1

阿倫 - 戴維的解決方案我不再需要... –

回答

4

這是data.table範圍內,通過簡單的操作

dt[, .(b = sum(b), c = c[which.max(b)]), by = a] 
# a b c 
# 1: a 6 p 
# 2: b 9 r 

類似的辦法是

dt[order(b), .(b = sum(b), c = c[.N]), by = a] 
+0

非常好,謝謝大衛。不知道哪個.max。你能否澄清c = c []符號?我沒有在data.table文檔中看到這個。 –

+1

這是一個普通的子設置功能,就像你從R基礎知道的那樣''c [which.max(b)]'意指「*其中'b'是最大值*'的'c'的值。 'c = c ['means「*創建一個名爲'c'的新列,它將包含該值*」 –