【问题标题】:Moving Averages on multiple columns - Grouped Data多列上的移动平均线 - 分组数据
【发布时间】:2016-03-14 15:14:24
【问题描述】:

如果这个问题已经得到解答,我们深表歉意。我今天经历了很多例子,但我找不到任何符合我想要做的事情。

我有一个需要计算 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 个部分,行数约为 100 万行。到目前为止,我发现 data.table 在处理这类卷方面非常快。

【问题讨论】:

  • 更多选项请参见here

标签: r data.table


【解决方案1】:

我们可以将zoo 包中的rollmeandata.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

【讨论】:

  • 你使用的种子和OP一样吗?
  • @mtoto 感谢您的快速回复,这正是我所需要的!
【解决方案2】:

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

【讨论】:

  • 谢谢!很高兴了解如何以多种方式解决同一个问题。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-16
    • 2017-09-01
    • 2013-12-22
    • 2023-03-12
    • 2022-01-26
    • 1970-01-01
    • 2018-10-21
    • 1970-01-01
    相关资源
    最近更新 更多