2012-11-02 22 views
9

Tôi biết điều này có thể đạt được với các gói khác, nhưng tôi đang cố gắng làm điều đó trong data.table (vì nó có vẻ là nhanh nhất để nhóm).Cách lấy độ dài của nhóm hiện tại trong nhóm data.table?

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

kết quả trong

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

trong khi

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

sản xuất

a V1 
1 1 1 
2 2 2 
3 3 1 

mà là một kết quả hợp lý hơn. Chỉ cần tự hỏi tại sao data.table không cho kết quả tương tự, và làm thế nào điều này có thể đạt được.

Trả lời

16

Cách data.table để làm điều này là sử dụng biến đặc biệt, .N, theo dõi số hàng trong nhóm hiện tại. (Biến đặc biệt khác bao gồm .SD, .BY (trong phiên bản 1.8.2) và .I.GRP (có sẵn từ phiên bản 1.8.3) Tất cả được diễn tả trong ?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 

Để xem lý do tại sao những gì bạn đã cố gắng didn' t làm việc, chạy sau, kiểm tra giá trị của alength(a) ở mỗi hộp thoại trình duyệt:

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

+1 @jamborta Cũng xem [FAQ 2.10] (http: //datatable.r-forge.r-project. org/datatable-faq.pdf) cho một số nền. Lý do cho nó là hiệu quả để tránh lặp lại cùng một giá trị nhóm thông qua một vector dài tiềm năng (thời gian và không gian). Trong các ops với các vectơ dài hơn, R sẽ tái chế chiều dài 1 vectơ, nếu và khi cần thiết. Vì vậy, '.N' là con đường để đi đến đây. –

+0

Cảm ơn các bạn, điều này rất hữu ích. – jamborta

Các vấn đề liên quan