我有一个时间序列价格的数据框,我想在数据框中有一个新列,它是前10个价格观察值的平均值。因此,这个新变量必须从第10行开始并且滚动,即观察10是前10个价格的平均值(观察1-10),观察11是前10个价格的平均值(观察2-11),依此类推。
答案 0 :(得分:1)
使用running()
包中的gtools
:
#dummy data
set.seed(123)
df <- data.frame(x=round(runif(12,1,10)))
require(gtools)
#get running mean starting on 10th row
df$RunningMean <- running(df$x,width = 10,pad=TRUE)
df
#output
x RunningMean
1 4 NA
2 8 NA
3 5 NA
4 9 NA
5 9 NA
6 1 NA
7 6 NA
8 9 NA
9 6 NA
10 5 6.2
11 10 6.8
12 5 6.5
或者如果你喜欢一起使用gtools和dplyr。同样的结果。
library(gtools); library(dplyr)
df <- data.frame(x=round(runif(12,1,10)))
df %>% mutate(RunningMean = running(x, width=10, pad=TRUE, fun=mean))
答案 1 :(得分:1)
或者只需使用filter
即可在不加载额外包的情况下执行此操作:
set.seed(123)
df <- data.frame(x=round(runif(12,1,10)))
n <- 10
df <- within(df,{
runmean <- filter(x,rep(1/n,n), sides=1)
})
另一个提示:如果你想在数据框中这样做并且你不想一直输入那些美元符号,请使用方便的函数within()
,就像我在示例中所做的那样。不要忘记放置参数sides=1
,否则你将以你所在的值为中心(这是默认值)。
答案 2 :(得分:1)
您可以使用zoo
(使用@ KFB&#39的示例)。使用align
参数,您可以为要占用的left
指定right
,center
或NAs
。
library(zoo)
rollmean(df$x, k=10,na.pad=TRUE, align="right")
#[1] NA NA NA NA NA NA NA NA NA 6.2 6.8 6.5
答案 3 :(得分:-1)
#the first 9 rows are blank
for (i in 1:9)
{
average[i]=NA
}
for (i in 1:(length(prices)-9))
{
average[i+9]=mean(prices[i:(i+9)])
}