2017-07-30 41 views
0

好了,所以让我们这个代码计算滚动简单移动平均超过2天时间:的R - 下面这些代码编写行的更优雅的方式

# Use TTR package to create rolling SMA n day moving average 
new.df$close.sma.n2 <- SMA(new.df[,"Close"], 2) 

可以说,我想计算的N天期2:30

这里的输入是:

close.sma.n ** ,也为SMA计算的数值。

所以我的问题是: 我如何写一行代码在不同的SMA期间执行上述计算,并创建一个新的列,其中包含相应的close.sma.n2,3,4,5,6等值在数据框中?

我明白我可以这样做:

n.sma <- 2:30 

,并将该变量:

new.df$close.sma.n2 <- SMA(new.df[,"Close"], n.sma) 

或许我可以:

name <- "n2:30" 

和地点内:

new.df$close.sma.name <- SMA(new.df[,"Close"], n.sma) 

回答

2

您没有提供样本数据或SMA,所以我编写了虚拟函数来测试我的代码。

df <- data.frame(Close=c(1, 2, 3, 4)) 
SMA <- function(x, numdays) {numdays} 

于是,我写了一个函数,它的天数平均,并返回一个函数,它接受一个data.frame和过了好些日子采取SMA。

getSMA <- function(numdays) { 
    function(new.df) { 
    SMA(new.df[,"Close"], numdays) 
    } 
} 

然后,创建一个矩阵把形状记忆合金在

smas <- matrix(nrow=nrow(df), ncol=0) 

并填写。

for (i in 2:30) { 
    smas <- cbind(smas, getSMA(i)(df)) 
} 

然后,你想他们是

colnames(smas) <- sapply(2:30, function(n)paste("close.sma.n", n, sep="")) 

,并开始数据帧绑定该怎么设置列名。

df <- cbind(df, smas) 

现在,你有你的原始data.frame,加上"close.sma.n2" through ".n30"

+0

真棒! :D这节省了我很多重复的线条写作 –

+1

很高兴帮助!一般来说,使用创建函数的函数通常很难将头部包裹起来,但是当你想做很重复的但稍微不同的事情时,它可能非常有用。看看哈德利Wickam的[高级R](http://adv-r.had.co.nz/)书更多 –

+0

好吧,这是我的下一个学习曲线(函数/循环),我有一些很好的基础知识下来,似乎每次我使用RI学习新的东西,或者重新验证之前做过的事情,或者更多地理解它。我肯定会检查一下这本书 –

相关问题