使用 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
我需要 运行 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