2012-07-27 35 views
12

Tôi có sau mẫu data.table:tập hợp nhiều cột trong data.table

dtb <- data.table(a=sample(1:100,100), b=sample(1:100,100), id=rep(1:10,10)) 

Tôi muốn kết hợp lại tất cả các cột (a, b, mặc dù họ phải được giữ riêng biệt) bằng cách sử dụng id colSums, ví dụ . cách chính xác để làm điều này là gì? Sau đây không hoạt động:

dtb[,colSums, by="id"] 

Đây chỉ là một mẫu và bảng của tôi có nhiều cột vì vậy tôi muốn tránh xác định tất cả trong số họ trong tên hàm

Trả lời

24

này thực sự là những gì tôi đang tìm kiếm và được nhắc đến trong FAQ:

dtb[,lapply(.SD,mean),by="id"] 
+3

+1 Đây, bạn hoàn toàn đúng, đây chắc chắn là cách tốt hơn. Tôi luôn nghĩ rằng tôi nên có mọi thứ ở định dạng dài, nhưng khá thường xuyên, như trong trường hợp này, việc tính toán hiệu quả hơn. Bạn nên đánh dấu bạn là câu trả lời đúng. –

+0

ok âm thanh tốt, tôi sẽ thay đổi điều này thành câu trả lời đúng. – Alex

+0

+1 Btw, cú pháp này đã được tối ưu hóa trong phiên bản v1.8.2 mới nhất. Đã từng là một hình phạt tốc độ khi sử dụng 'lapply' trong' j' như thế, nhưng không còn nữa. Các bản sửa đổi cho các điểm wiki 'data.table' đã được thực hiện, và đến điểm 5 là cần thiết. –

0

Tôi đoán trong trường hợp này là nó nhanh nhất để mang dữ liệu của bạn đầu tiên sang định dạng dài và làm hợp của bạn bên cạnh (xem ý kiến ​​của Matthew trong SO post này):

library(data.table) 
dtb <- data.table(a=sample(1:100,100), b=sample(1:100,100), id=rep(1:10,10)) 
library(reshape2) 
dt_long <- as.data.table(melt(dtb, id.var="id")) 
dt_long[, sum(value), by=c("id","variable")] 
    id variable V1 
1: 1  a 601 
2: 2  a 440 
3: 3  a 496 
4: 4  a 553 
5: 5  a 444 
6: 6  a 466 
7: 7  a 525 
8: 8  a 553 
9: 9  a 541 
... 
+0

điều này có vẻ khá kém hiệu quả .. không có cách nào để chỉ chọn id của một lần thay vì một lần cho mỗi biến? – Alex

+0

Tôi đang bối rối ... Bạn có ý nghĩa gì bởi không hiệu quả? Có quá nhiều mã để viết hoặc quá chậm? Và bạn có ý nghĩa gì khi chỉ chọn id một lần thay vì một lần cho mỗi biến? Bạn không muốn tổng cho mỗi biến và id kết hợp? –

+0

vâng, đúng vậy. không hiệu quả tôi có nghĩa là có bao nhiêu tìm kiếm thông qua khung dữ liệu mà mã phải làm. trừ khi tôi không hiểu cơ sở của cách R đang làm việc, với một hoạt động vectơ, id phải được tra cứu một lần và sau đó tổng số các cột được thực hiện như một hoạt động vectơ. theo cách bạn đề xuất, (id, biến) phải được tra cứu mọi lúc. trong bảng của tôi, tôi có khoảng 200 cột để tạo nên sự khác biệt. Không? – Alex

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