2013-05-14 43 views
12

Giả sử tôi có một data.table:Sử dụng một cột yếu tố trong "bởi" và không thả yếu tố rỗng

x <- data.table(x=runif(3), group=factor(c('a','b','a'), levels=c('a','b','c'))) 

Tôi muốn biết có bao nhiêu hàng trong x tồn tại cho mỗi group:

x[, .N, by="group"] 
# group N 
# 1:  a 2 
# 2:  b 1 

Câu hỏi: có cách nào để buộc bên trên by="group" xem xét tất cả các cấp của hệ số group không?

Lưu ý cách tôi không có bất kỳ hàng nào có số group 'c' trong bảng, tôi không nhận được hàng cho c.

đầu ra mong muốn:

x[, .N, by="group", ???] # somehow use all levels in `group` 
# group N 
# 1:  a 2 
# 2:  b 1 
# 3:  c 0 
+0

Tại sao không thêm các mức còn thiếu sau đó, chẳng hạn như 'merge (y, data.table (group = levels (x [, group])), bởi =" group ", all = TRUE)' và sau đó biến 'NA' thành 0? – Roland

+0

Tôi không biết một giải pháp chung, nhưng đối với '.N' một mình, bạn có thể rơi vào' table': 'x [, table (group)]' (như bạn có thể đã biết). – Frank

Trả lời

14

Nếu bạn sẵn sàng để chạy thông qua các cấp yếu tố bằng cách liệt kê chúng trong i (chứ không phải bằng cách thiết lập by="group"), điều này sẽ giúp bạn có được hy vọng kết quả.

setkey(x, "group") 
x[levels(group), .N, by=.EACHI] 
# group N 
# 1:  a 2 
# 2:  b 1 
# 3:  c 0 
+0

Aha, công trình này tuyệt vời! cổ vũ. –

+0

@Henrik - Tốt bắt! Cảm ơn vì điều đó. Thay đổi cả hai. –

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