使用 R 中先前行的值增量更新行

Incrementally updatating rows using values from previous rows in R

我需要 运行 R 中的一个脚本,用于更新给定行中关于前几行历史的值。更具体地说,我想计算一段时间内某些给定列的平均值。我来解释一下。

说,我有以下 table:

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 中有一个我不知道的已知解决方案,因此如果有任何本地方法库可以执行此类条件更新,欢迎提供任何帮助。您还可以假设行已经按日期排序,以防有帮助。

提前致谢!

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

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

这是 dplyr

中带有 cummean 的选项
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