我确信在移动平均线上有更优雅的编码方式,但我处于学习模式。想象一下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 :(得分: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