【问题标题】:Using lapply on quantmod, get straight to xts object?在 quantmod 上使用 lapply,直接进入 xts 对象?
【发布时间】:2014-12-25 18:34:22
【问题描述】:

我正在从雅虎导入一些股票数据,并希望将每日范围计算为高 - 低。然后我想把每只股票的范围放在一个 xts 对象中。下面的代码完成了这一点,但对我来说似乎很复杂。

问题从 lapply 开始。我得到了 xts 对象的列表,但需要使用 [[ ]] 来“向下一层”引用各个对象。如果我可以将每个 xts 对象引用为引号 [i],我可以继续使用 apply 函数而不是 for 循环。我尝试使用 sapply 而不是 lapply 但出现错误,“数组错误(r,dim = d,dimnames = if (!(is.null(n1

此外,我讨厌我在第二个 for 循环中使用的做法。 range 尚不存在,因此我需要创建它,但以这种方式执行它似乎违背了循环的目的。有没有更好的办法?我也想避免创建一个空的 xts 对象,因为我知道这也不是一个好习惯。

require(quantmod)
tickers <- c("ERX", "EWJ", "EWW", "EWZ", "FAS", "FAZ")

quotes <- lapply(tickers,function(x) getSymbols(x, src="yahoo", from="2014-10-10", auto.assign=FALSE)) 
names(quotes) <- tickers

for (i in 1:length(quotes)){
  quotes[[i]] <- quotes[[i]][,2] - quotes[[i]][,3]
  colnames(quotes[[i]]) <- paste(names(quotes)[i], "Range")
}

for (i in 1:length(quotes)){

  if (i == 1) {range <- quotes[[i]]}

  else {range <- merge(range, quotes[[i]])}
}

谢谢。

【问题讨论】:

    标签: r xts quantmod


    【解决方案1】:

    最简单的方法是将数据存储在环境中,然后用eapply循环遍历环境中的所有对象:

    require(quantmod)
    tickers <- c("ERX", "EWJ", "EWW", "EWZ", "FAS", "FAZ")
    dataEnv <- new.env()
    getSymbols(tickers, env=dataEnv)
    # Calculate the range for all objects,
    # then merge all range columns into one object
    hl <- do.call(merge, eapply(dataEnv, function(x) Hi(x)-Lo(x)))
    # update the column names
    colnames(hl) <- gsub("(.*)High$", "\\1Range", colnames(hl))
    

    【讨论】:

    • 谢谢约书亚。这是您创建的一个包,非常有帮助。
    • @user2926358:谢谢,但我没有创建 quantmod。杰夫瑞恩做到了。
    • @user2926358:大声笑,杰夫也写了大部分内容(我更像是一个共鸣板)!感谢您的感谢;我只是想在信用到期的地方给予信用。 :)
    • TTR 很棒;没有它,quantmod 就不一样了。 ;-)
    猜你喜欢
    • 1970-01-01
    • 2018-03-21
    • 2018-09-03
    • 2012-12-02
    • 1970-01-01
    • 2020-09-13
    • 2018-07-18
    • 1970-01-01
    • 2019-06-15
    相关资源
    最近更新 更多