R - 更优雅的编写代码行的方式

时间:2017-07-30 14:31:43

标签: r

好的,让我们在下面的代码中计算2天内的滚动简单移动平均值:

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

假设我想计算2:30的n天期间

这里的输入是:

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)

1 个答案:

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

然后,创建一个矩阵以将SMA放入

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"