2012-11-02 17 views
9

Bunun diğer paketlerle elde edilebileceğini biliyorum, ancak data.table'da yapmaya çalışıyorum (gruplama için en hızlı görünen gibi).Veri grubu gruplandırmasında mevcut grubun uzunluğu nasıl elde edilir?

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

ise

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

içinde

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

sonuç daha mantıklı bir sonuç olduğunu

a V1 
1 1 1 
2 2 2 
3 3 1 

üretir. Sadece neden data.table'un aynı sonuçları vermediğini ve bunun nasıl başarılabileceğini merak ediyorum.

cevap

16

Bunu yapmanın data.table yolu, geçerli gruptaki satır sayısını takip eden .N özel değişkenini kullanmaktır. '

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 

görmek için, vermedin çalıştı neyi niçin: (. Diğer özel değişkenler .SD, .BY (sürümü 1.8.2) ve sürüm 1.8.3 edinilebilir .I ve .GRP() Tüm ?data.table belgelenir dahil) t çalışması, her bir tarayıcı isteminde a ve length(a) değerini kontrol aşağıdaki çalıştırmak: //datatable.r-forge.r-project:

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

+1 @jamborta da [SSS 2.10] (bkz http. bazı arka plan için org/datatable-faq.pdf). Bunun nedeni, potansiyel olarak uzun bir vektör (zaman ve alan) yoluyla aynı grup değerini tekrar etmekten kaçınmaktır. Daha uzun vektörlere sahip opslerde, R, gerektiğinde ve gerektiğinde 1 uzunluğundaki vektörleri geri dönüştürecektir. Yani '' 'buraya gitmenin yolu. –

+0

Teşekkürler çocuklar, bu çok yararlı. – jamborta