2012-11-02 57 views
9

我知道這可以通過其他軟件包來實現,但我試圖在data.table中執行它(因爲它似乎是分組中速度最快的)。如何獲取data.table分組中的當前組的長度?

library(data.table) 
dt = data.table(a=c(1,2,2,3)) 
dt[,length(a),by=a] 

導致

a V1 
1: 1 1 
2: 2 1 
3: 3 1 

df = data.frame(a=c(1,2,2,3)) 
ddply(df,.(a),summarise,V1=length(a)) 

產生

a V1 
1 1 1 
2 2 2 
3 3 1 

這是比較明智​​的結果。只是想知道爲什麼data.table沒有給出相同的結果,以及如何實現。

回答

16

data.table的做法是使用特殊變量.N,它跟蹤當前組中的行數。 (其他特殊變量包括.SD.BY(在1.8.2版本)和.I.GRP(可從1.8.3版本)所有在?data.table記載。):

library(data.table) 
dt = data.table(a=c(1,2,2,3)) 

dt[, .N, by = a] 
# a N 
# 1: 1 1 
# 2: 2 2 
# 3: 3 1 

要知道爲什麼你試過沒」噸工作,運行以下,在每個瀏覽器提示檢查的alength(a)值:

dt[, browser(), by = a] 
+1

1 @jamborta另請參見[FAQ 2.10](HTTP://datatable.r-forge.r-project。 org/datatable-faq.pdf)。其原因是通過可能長的矢量(時間和空間)來避免重複相同的組值。在具有較長向量的操作系統中,無論如何,如果需要,R將循環長度爲1的向量。所以'.N'是要走的路。 –

+0

謝謝你們,這非常有用。 – jamborta