2012-11-02 10 views
9

Wiem, że można to osiągnąć za pomocą innych pakietów, ale próbuję to zrobić w data.table (ponieważ wydaje się, że jest najszybszy do grupowania).Jak uzyskać długość bieżącej grupy w grupie data.table?

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

skutkuje

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

podczas gdy

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

produkuje

a V1 
1 1 1 
2 2 2 
3 3 1 

który jest bardziej sensowne wyniki. Zastanawiam się, dlaczego data.table nie daje takich samych wyników i jak można to osiągnąć.

Odpowiedz

16

W tym celu skorzystaj ze zmiennej specjalnej, .N, która śledzi liczbę wierszy w bieżącej grupie. (Inne zmienne specjalne obejmują .SD, .BY (w wersji 1.8.2) i .I i .GRP (dostępne od wersji 1.8.3) Wszystkie są udokumentowane w ?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 

Aby zrozumieć, dlaczego to, co próbował didn” t pracy, uruchom następujące, sprawdzając wartość a i length(a) w każdym wierszu przeglądarki:

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

+1 @jamborta patrz także [FAQ 2.10] (http: //datatable.r-forge.r-project. org/datatable-faq.pdf) dla niektórych środowisk. Powodem tego jest efektywność unikania powtarzania tej samej wartości grupy przez potencjalnie długi wektor (czas i przestrzeń). W ops z dłuższymi wektorami, R i tak zresetuje wektory długości długości 1, jeśli zajdzie taka potrzeba. Więc '.N' jest sposobem na przejście tutaj. –

+0

Dzięki chłopaki, jest to bardzo przydatne. – jamborta

Powiązane problemy