2013-04-19 18 views
5

Tôi đang cố tính toán các phương tiện cán của tập dữ liệu không cân bằng. Để minh họa cho quan điểm của tôi tôi đã sản xuất ví dụ đồ chơi này của dữ liệu của tôi:Tạo ra mức trung bình cán của tất cả các quan sát trước trên mỗi ID trong bộ dữ liệu bảng không cân bằng

ID year Var RollingAvg(Var) 
1 2000 2  NA 
1 2001 3  2 
1 2002 4  2.5 
1 2003 2  3 
2 2001 2  NA 
2 2002 5  2 
2 2003 4  3.5 

Cột RollingAvg(Var) là những gì tôi muốn, nhưng không thể có được. Nói cách, tôi đang tìm kiếm trung bình cán của tất cả các quan sát trước đây của Var cho mỗi ID. Tôi đã thử sử dụng rollapplyddply trong gói zoo và gói plyr, nhưng tôi không thể biết cách đặt độ dài cửa sổ cuộn để sử dụng TẤT CẢ các quan sát trước đó cho mỗi ID. Có lẽ tôi nên sử dụng gói plm thay thế? Bất kỳ trợ giúp được đánh giá cao.

Tôi đã xem các bài đăng khác trên các phương tiện cán trên bộ dữ liệu bảng BALANCED, nhưng tôi không thể ngoại suy câu trả lời của họ cho dữ liệu không cân bằng.

Cảm ơn,

M

+0

tôi không hiểu tại sao hàng thứ 5 của 'RollingAvg (Var)' 'NA'? –

+0

Tôi nghĩ rằng đó là tính toán cho mỗi 'ID' – Metrics

+0

Sản lượng dự kiến ​​của bạn có chính xác không? – Metrics

Trả lời

7

Sử dụng data.table:

library(data.table) 
d = data.table(your_df) 

d[, RollingAvg := {avg = cumsum(Var)/seq_len(.N); 
        c(NA, avg[-length(avg)])}, 
    by = ID] 

(hoặc thậm chí đơn giản)

d[, RollingAvg := c(NA, head(cumsum(Var)/(seq_len(.N)), -1)), by = ID] 
+2

bạn không bao giờ nên sử dụng 'DT $ x = ...' với 'data.table' để sao chép toàn bộ bảng, chính xác là những gì nó cố gắng không làm. Sử dụng ': =' thay thế (đọc họa tiết) – statquant

+0

đủ công bằng, được sửa – eddi

+0

@eddi: Cảm ơn, điều đó có hiệu quả! Vẫn cố gắng để hiểu những gì đang xảy ra, nhưng tôi có lẽ sẽ đến đó :) Có thể mở rộng câu trả lời của bạn để người đầu tiên nói 2 quan sát được mã hóa ´NA 'thay vì chỉ đầu tiên? (Tôi biết nó không có trong câu hỏi gốc) – Mace

2

Giả sử rằng năm là tiếp giáp trong mỗi ID (đó là trường hợp trong dữ liệu mẫu) và DF là khung dữ liệu đầu vào, anh ấy tái là một giải pháp sử dụng chỉ căn R. cumRoll là một hàm thực hiện các hoạt động cần thiết trên một ID và ave sau đó thực hiện nó bằng ID:

cumRoll <- function(x) c(NA, head(cumsum(x)/seq_along(x), -1)) 
DF$Roll <- ave(DF$Var, DF$ID, FUN = cumRoll) 

Kết quả là:

> DF 
    ID year Var Roll 
1 1 2000 2 NA 
2 1 2001 3 2.0 
3 1 2002 4 2.5 
4 1 2003 2 3.0 
5 2 2001 2 NA 
6 2 2002 5 2.0 
7 2 2003 4 3.5 
Các vấn đề liên quan