2014-10-22 41 views
-1

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

+1

尝试寻找的“移动平均”,等你发现这样的问题:http://stackoverflow.com/questions/743812/calculating-moving-average-in-r – 2014-10-22 09:05:31

+0

或者试试库(gtools) running()函数:例如运行(data,width = 10,pad = TRUE,fun = mean)。 ?运行 – KFB 2014-10-22 09:06:59

+0

顺便一提,欢迎来到SO。人们总是愿意提供帮助,但您必须至少努力尝试首先解决问题。有很多关于滚动平均值的信息。因此,请先尝试一下,如果无法实现,请给我们一个可重复的例子以及您想实现的目标,我们很乐意为您提供帮助。 http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example – 2014-10-22 09:07:15

回答

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

有很多事情有问题。首先,不要在R中生长载体,这对于你的记忆来说是缓慢和地狱。其次,R中有矢量化解决方案,因此无需自行实施。第三,如果你想自己做,把所有东西都包装在一个函数中,这样它就不会改变你的全局工作空间中的东西。 – 2014-10-22 09:09:13

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

或者干脆用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,否则你会采取以你的价值为中心(这是默认值)。

1

你可以使用zoo(使用@KFB的例子)。使用align参数,您可以指定leftrightcenterNAs占据。

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 
相关问题