多列移动平均值 - 分组数据

时间:2016-03-14 15:14:25

标签: r data.table

如果已经回答,请道歉。我今天经历了很多例子,但我找不到任何与我想做的事情相符的事。

我有一个数据集,我需要计算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在处理这些卷时非常快。

3 个答案:

答案 0 :(得分:5)

我们可以使用rollmean包中的zoodata.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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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