移动平均线填充空Data.Frame

时间:2016-03-02 18:41:55

标签: r

我确信在移动平均线上有更优雅的编码方式,但我处于学习模式。想象一下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核心编程语言而不是软件包来完成此操作。

1 个答案:

答案 0 :(得分: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