2016-03-02 33 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