如何用另一列的前3行的平均值填充新列?在R中

时间:2019-02-26 22:26:54

标签: r database dataframe

说我有一个数据框,其中每一行代表不同的一天。我有一个带有日期的列,以及一个每天都有兴趣值的列。例如,我可能会创建一个像这样的数据框:

df<-data.frame(date=c("9/1","9/2","9/3","9/4","9/5","9/6"),value=c(2,3,5,8,11,12))

我想创建一个额外的列(为方便起见,命名为“ avg”),以对过去3天(包括该天)的值进行平均。换句话说,我希望上面创建的data.frame添加一个看起来像这样的附加列:

avg

NA

NA

3.33

5.33

8

10.33

如何在R中做到这一点? 如果可能的话,我也希望在7天前完成此操作,但是我认为该代码与该问题的代码非常相似。

3 个答案:

答案 0 :(得分:1)

> library(zoo)
> DF$avg <- c(NA, NA, rollmean(DF$value, 3))
> DF
  date value       avg
1  9/1     2        NA
2  9/2     3        NA
3  9/3     5  3.333333
4  9/4     8  5.333333
5  9/5    11  8.000000
6  9/6    12 10.333333

您还可以使用fillalign参数

rollmean(DF$value, 3, fill = NA, align = "right")

或考虑到@H 1的评论使用rollmeanr(df$value, 3, fill = NA)

答案 1 :(得分:0)

为了完整性起见,data.table软件包的1.12.0版(于2019年1月13日在CRAN上)获得了快速滚动的均值函数:

library(data.table)   # version 1.12.0+
setDT(df)[, avg := frollmean(value, 3L)]
df
   date value       avg
1:  9/1     2        NA
2:  9/2     3        NA
3:  9/3     5  3.333333
4:  9/4     8  5.333333
5:  9/5    11  8.000000
6:  9/6    12 10.333333

答案 2 :(得分:0)

使用sapply库,以base来考虑移动平均值。

df$avg_last_three <- c(NA, NA, sapply(3:nrow(df), function(i) mean(df$value[(i-2):i])))

df    
#   date value avg_last_three
# 1  9/1     2             NA
# 2  9/2     3             NA
# 3  9/3     5       3.333333
# 4  9/4     8       5.333333
# 5  9/5    11       8.000000
# 6  9/6    12      10.333333