使用R

时间:2017-03-08 23:32:20

标签: r moving-average

我需要在R中运行一个脚本,它更新给定行中关于前一行历史记录的值。更具体地说,我想计算一些给定列的平均值随时间的变化。我会解释一下。

说,我有下表:

Key  A   B   C      Date
  X  1   0   2  1/1/2017
  Y  2   1   1  2/1/2017
  X  2   1   3  3/1/2017
  X  6   2   2  4/1/2017
  Y  3   2   1  5/1/2017

我需要更新每一行,以便来自A,B和C列的每个值代表键X和Y的平均值,直到给定的日期。

所以在这种情况下,我们会有类似的东西:

Key    A    B    C      Date
  X    1    0    2  1/1/2017
  Y    2    1    1  2/1/2017
  X  1.5  0.5  2.5  3/1/2017
  X    3    1  2.3  4/1/2017
  Y  2.5  1.5    1  5/1/2017

我对R来说还是一个新手,我一直在寻找看起来太像程序代码的解决方案,而且看起来并不合适。通常在R中有一个我不知道的已知解决方案,因此如果有任何本地方法的lib用于执行此类条件更新,则欢迎任何帮助。您还可以假设行已按日期排序,以防它有用。

提前致谢!

编辑:修正了第4行C列的错误示例编号。

2 个答案:

答案 0 :(得分:4)

使用cumsum(x)/seq_along(x)对每个变量进行一些分组以获得累积均值。

dat[c("A","B","C")] <- lapply(
  dat[c("A","B","C")], function(x) ave(x, dat$Key, FUN=function(v) cumsum(v)/seq_along(v) ) 
)
dat

#  Key   A   B        C     Date
#1   X 1.0 0.0 2.000000 1/1/2017
#2   Y 2.0 1.0 1.000000 2/1/2017
#3   X 1.5 0.5 2.500000 3/1/2017
#4   X 3.0 1.0 2.333333 4/1/2017
#5   Y 2.5 1.5 1.000000 5/1/2017

答案 1 :(得分:1)

以下是来自cummean

dplyr选项
library(dplyr)
dat %>% 
   group_by(Key) %>% 
   mutate_at(vars(A, B, C), cummean)
#   Key     A     B        C     Date
#  <chr> <dbl> <dbl>    <dbl>    <chr>
#1     X   1.0   0.0 2.000000 1/1/2017
#2     Y   2.0   1.0 1.000000 2/1/2017
#3     X   1.5   0.5 2.500000 3/1/2017
#4     X   3.0   1.0 2.333333 4/1/2017
#5     Y   2.5   1.5 1.000000 5/1/2017