2016-03-14 16 views
5

Xin lỗi nếu điều này đã được trả lời. Tôi đã trải qua rất nhiều ví dụ ngày hôm nay nhưng tôi không thể tìm thấy bất kỳ điều gì phù hợp với những gì tôi đang cố gắng làm.Di chuyển trung bình trên nhiều cột - Dữ liệu được nhóm

Tôi có tập dữ liệu mà tôi cần tính toán trung bình động 3 điểm trên. Tôi đã tạo một số dữ liệu giả bên dưới:

set.seed(1234) 
data.frame(Week = rep(seq(1:5), 3), 
Section = c(rep("a", 5), rep("b", 5), rep("c", 5)), 
Qty = runif(15, min = 100, max = 500), 
To = runif(15, min = 40, max = 80)) 

Tôi muốn tính MA cho mỗi nhóm dựa trên cột 'Mục' cho cả cột 'Qty' và 'To'. Lý tưởng nhất là đầu ra sẽ là một bảng dữ liệu. Trung bình di chuyển sẽ bắt đầu vào tuần thứ 3 vì vậy sẽ là trung bình của các số 1: 3

Tôi đang cố gắng làm chủ gói data.table để giải pháp sử dụng sẽ tuyệt vời nhưng nếu không thì sẽ được đánh giá cao.

Chỉ để tham chiếu, tập dữ liệu thực tế của tôi sẽ có khoảng. 70 phần với tổng số hàng c.1M. Tôi đã tìm thấy data.table để được cực kỳ nhanh chóng tại crunching các loại khối lượng cho đến nay.

+0

Xem thêm [ở đây] (http://stackoverflow.com/questions/32649913/calculating-sum-of-previous-3-rows-in- r-data-table-by-grid-square /) cho một số tùy chọn khác –

Trả lời

5

Chúng tôi có thể sử dụng rollmean từ gói zoo, kết hợp với data.table.

library(data.table) 
library(zoo) 
setDT(df)[, c("Qty.mean","To.mean") := lapply(.SD, rollmean, k = 3, fill = NA, align = "right"), 
       .SDcols = c("Qty","To"), by = Section] 
> df 
# Week Section  Qty  To Qty.mean To.mean 
#1: 1  a 145.4814 73.49183  NA  NA 
#2: 2  a 348.9198 51.44893  NA  NA 
#3: 3  a 343.7099 50.67283 279.3703 58.53786 
#4: 4  a 349.3518 47.46891 347.3271 49.86356 
#5: 5  a 444.3662 49.28904 379.1426 49.14359 
#6: 1  b 356.1242 52.66450  NA  NA 
#7: 2  b 103.7983 52.10773  NA  NA 
#8: 3  b 193.0202 46.36184 217.6476 50.37802 
#9: 4  b 366.4335 41.59984 221.0840 46.68980 
#10: 5  b 305.7005 48.75198 288.3847 45.57122 
#11: 1  c 377.4365 72.42394  NA  NA 
#12: 2  c 317.9899 61.02790  NA  NA 
#13: 3  c 213.0934 76.58633 302.8400 70.01272 
#14: 4  c 469.3734 73.25380 333.4856 70.28934 
#15: 5  c 216.9263 41.83081 299.7977 63.89031 
+0

bạn có sử dụng cùng một hạt giống như OP không? – agenis

+0

@mtoto cảm ơn bạn đã trả lời nhanh, đó chính xác là những gì tôi cần !! – MidnightDataGeek

+0

@agenis bạn đúng, trả lời cập nhật. – mtoto

1

Một giải pháp sử dụng dplyr:

library(dplyr); library(zoo) 
myfun = function(x) rollmean(x, k = 3, fill = NA, align = "right") 
df %>% group_by(Section) %>% mutate_each(funs(myfun), Qty, To) 
#### Week Section  Qty  To 
#### (int) (fctr) (dbl) (dbl) 
#### 1  1  a  NA  NA 
#### 2  2  a  NA  NA 
#### 3  3  a 279.3703 58.53786 
#### 4  4  a 347.3271 49.86356 
+0

cảm ơn bạn! Thật tốt khi xem bạn có thể giải quyết cùng một vấn đề theo nhiều cách như thế nào. – MidnightDataGeek

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