2012-11-02 5 views
9

Ich weiß, dass dies mit anderen Paketen erreicht werden kann, aber ich versuche es in data.table zu tun (wie es scheint am schnellsten für die Gruppierung zu sein).Wie erhält man die Länge der aktuellen Gruppe in data.table Gruppierung?

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

Ergebnisse in

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

während

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

produzieren

a V1 
1 1 1 
2 2 2 
3 3 1 

, die ein sinnvolleren Ergebnisse sind. Ich frage mich nur, warum data.table nicht die gleichen Ergebnisse gibt, und wie dies erreicht werden kann.

Antwort

16

Die data.table Möglichkeit, dies zu tun, ist spezielle Variable, .N, die die Anzahl der Zeilen in der aktuellen Gruppe verfolgt. (Weitere Sondergrößen sind .SD, .BY (in Version 1.8.2) und .I und .GRP (verfügbar ab Version 1.8.3) Alle sind in ?data.table dokumentiert.):

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 

Um zu sehen, warum das, was Sie didn versucht‘ t Arbeit, führen Sie den folgenden Überprüfung der Wert von a und length(a) an jedem Browser prompt:

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

+1 @jamborta siehe auch [FAQ 2.10] (http: //datatable.r-forge.r-project. org/datatable-faq.pdf) für etwas Hintergrund. Der Grund dafür ist die Effizienz, um zu vermeiden, dass derselbe Gruppenwert durch einen möglicherweise langen Vektor (Zeit und Raum) wiederholt wird. In Ops mit längeren Vektoren wird R Vektoren der Länge 1 sowieso rezyklieren, falls und wenn es benötigt wird. Also '.N' ist der Weg hierher zu gehen. –

+0

Danke Jungs, das ist sehr nützlich. – jamborta

Verwandte Themen