2016-03-02 58 views
1

我相信移动平均中有更优雅的编码方式,但我处于学习模式。想象一下SPX的每月收盘价格。我使用for循环创建了一个移动平均值,填充空向量。有用。这是代码。移动平均填充空数据。框架

moving_average_new <- c() 
for(i in 1:(length(spx_Close)-10)) { 
     moving_average_new[i] <- sum(spx_Close[i:(i+(10-1))])/10   
     } 

我希望能够做同样的事情,但这次我想用一个调用for循环和一个空data.frame填充功能。我一直在疯狂尝试,但我无法弄清楚。这是我所在的地方。

y<- as.data.frame(spx_Close) 
ma_new <- data.frame() 
ma_func1 <- function() { 
     for (i in 1:(nrow(y) - 10)) { 
       ma_new[i] <- sum(y[(i:(i+10-1)),1])/10   
     } 
} 

我不知道我是否正确初始化data.frame,或者如果我的函数没有意义。运行该函数后,我的变量ma_new有0个观察值。我希望能够仅使用R核心编程语言来做到这一点,而不是一个包。

回答

0

rollmean来自zoo包可以做到这一点。这里有一个例子:

library(zoo) 

rollmean(mtcars$mpg, k=10, align="left", fill=NA) 

[1] 20.37 20.05 19.59 19.04 18.42 17.59 16.82 16.86 17.66 18.42 19.89 20.26 20.17 
[14] 19.96 19.77 20.65 22.34 23.47 23.27 21.81 20.39 19.74 20.33 NA NA NA 
[27] NA NA NA NA NA NA 

在你的功能方面,有几件事要解决。

首先,你的函数没有参数。该函数需要一个数据帧,因此您需要一个参数y,它可以将数据帧传递到函数代码中。

其次,需要将计算出的值分配给ma_new中的行和列,而不是只将空行数据框中的行分配给行。例如,看看如果你只是做ma_new=data.frame(); ma_new[1] = 10会发生什么。

三,函数需要返回移动平均值的向量。

这里的函数的修订版本:

ma_func1 <- function(y) {    # Added argument y 
    for (i in 1:(nrow(y) - 10)) { 
    ma_new[i, "MovingAvg"] <- sum(y[(i:(i+10-1)),1])/10 # Assign value to column called "MovingAvg" 
    } 
    ma_new  # Return the vector of moving average values 
} 
ma_func1(mtcars) 
MovingAvg 
1  20.37 
2  20.05 
3  19.59 
4  19.04 
5  18.42 
6  17.59 
7  16.82 
8  16.86 
9  17.66 
10  18.42 
11  19.89 
12  20.26 
13  20.17 
14  19.96 
15  19.77 
16  20.65 
17  22.34 
18  23.47 
19  23.27 
20  21.81 
21  20.39 
22  19.74 
+0

对不起。在此之前我应该​​注意到,我正在尝试使用核心R编程语言来执行此操作,而不是使用任何软件包。这是一个学习练习 - 试图在data.frames和函数中做我能够做的循环和向量。 – huesecon