我需要在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列的错误示例编号。
答案 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