簡體   English   中英

多列移動平均值 - 分組數據

[英]Moving Averages on multiple columns - Grouped Data

如果已經回答,請道歉。 我今天經歷了很多例子,但我找不到任何符合我要做的事情。

我有一個數據集,我需要計算3點移動平均線。 我在下面生成了一些虛擬數據:

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))

我想根據'Qty'和'To'列的'Section'列計算每個組的MA。 理想情況下,輸出將是數據表。 移動平均線將從第3周開始,因此將是1:3的平均值

我正在嘗試掌握data.table包,所以使用它的解決方案將是偉大的,否則任何將非常感激。

僅供參考,我的實際數據集將有大約。 70個部分,總共有c.1M行。 到目前為止,我發現data.table非常快速地處理這些卷。

我們可以使用rollmeanzoo包,結合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

使用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

目前在data.table 1.12.0中使用新的frollmean函數的方法更快。

setDT(df)[, c("Qty.mean","To.mean") := frollmean(.SD, 3),
            .SDcols = c("Qty","To"),
            by = Section]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM