【问题标题】:R - More elegant way of writing line of codeR - 更优雅的代码行编写方式
【发布时间】:2017-07-30 14:31:42
【问题描述】:

好的,让我们使用下面的代码计算 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)

【问题讨论】:

    标签: r


    【解决方案1】:

    您没有提供示例数据或 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"

    【讨论】:

    • 太棒了! :D 这为我节省了很多重复的行书写
    • 很高兴为您提供帮助!一般来说,使用创建函数的函数通常很难让你理解,但当你想做非常重复但略有不同的事情时,它会非常有用。查看 Hadley Wickam 的 Advanced R 书籍了解更多信息
    • 好的,这是我的下一个学习曲线(函数/循环),我有一些很好的基础知识,似乎每次使用 R 时我都会学到一些新东西,或者重新验证我之前做过的事情或者更了解它。我一定会去看看这本书
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-03
    • 2017-03-31
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多