2011-11-18 28 views
5

Tôi phải làm điều gì đó sai vì chức năng này không hoàn thành.Tổng hợp để tạo ma trận tần số lấy thời gian dài

Tôi đang cố gắng tổng hợp một số dữ liệu theo tuần. Dữ liệu được chia thành id và số tuần. Tôi muốn kết quả có id là hàng, tuần làm cột và tổng số là các giá trị.

Ví dụ về những gì tôi đã cố gắng cho đến nay (đã thử một loạt các vấn đề khác, bao gồm thêm một biến giả = 1 và sau đó fun.aggregating = sum trên đó):

ddply(data, .(id), dcast, id~weeknumber, value_var="id", 
     fun.aggregate=length, fill=0, .parallel=TRUE) 

Có một tốt hơn cách để làm điều này?

Input:

id  week 
1  1 
1  2 
1  3 
1  1 
2  3 

Output:

1 2 3 
1 2 1 1 
2 0 0 1 

Trả lời

10

Bạn không cần ddply cho việc này. Các dcast từ reshape2 là đủ:

dat <- data.frame(
    id = c(rep(1, 4), 2), 
    week = c(1:3, 1, 3) 
) 

library(reshape2) 
dcast(dat, id~week, fun.aggregate=length) 

    id 1 2 3 
1 1 2 1 1 
2 2 0 0 1 

Edit: Đối với một giải pháp cơ sở R (trừ table - như được đăng bởi Joshua Uhlrich), hãy thử xtabs:

xtabs(~id+week, data=dat) 

    week 
id 1 2 3 
    1 2 1 1 
    2 0 0 1 
12

Bạn có thể chỉ cần sử dụng lệnh table:

table(data$id,data$week) 

    1 2 3 
    1 2 1 1 
    2 0 0 1 
+0

+1 Blast. Bạn có một sở trường làm cho các giải pháp của tôi trông hoàn toàn dài, vòng xoay và người đi bộ. – Andrie

+2

Nếu bạn có nhiều dữ liệu và thao tác không thể đơn giản hóa được nhiều, thì gói 'data.table' có thể giúp bạn. –

6

Lý do ddply mất nhiều thời gian là việc chia tách theo nhóm không chạy song song (chỉ tính toán trên 'chia tách'), do đó với số lượng lớn nhóm sẽ chậm (và .parallel = T) sẽ không trợ giúp .

Cách tiếp cận data.table sẽ cực kỳ hiệu quả về thời gian và bộ nhớ.

Đối với hiệu quả data.table nó là tốt nhất để làm việc trong dạng dài để làm nhóm và sau đó định hình lại để rộng

library(data.table) 
library(reshape2) 
DT <- data.table(data) 

setkeyv(DT, 'id') 

dcast(DT[, .N, by = list(id, week)], id~ week, fill = 0) 
Các vấn đề liên quan