说我有一个数据框,其中每一行代表不同的一天。我有一个带有日期的列,以及一个每天都有兴趣值的列。例如,我可能会创建一个像这样的数据框:
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天前完成此操作,但是我认为该代码与该问题的代码非常相似。
答案 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
您还可以使用fill
和align
参数
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