数据框中的新变量

时间:2014-10-22 08:57:18

标签: r dataframe average

我有一个时间序列价格的数据框,我想在数据框中有一个新列,它是前10个价格观察值的平均值。因此,这个新变量必须从第10行开始并且滚动,即观察10是前10个价格的平均值(观察1-10),观察11是前10个价格的平均值(观察2-11),依此类推。

4 个答案:

答案 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指定rightcenterNAs

 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)])
}