这是R中的新手问题。我正在使用R下载Yahoo Finance每月股票价格数据,其中从文本文件中读取了股票代号。我正在使用循环读取代码名称以下载数据并将它们放在列表中。我的问题是某些股票代号名称可能不正确,因此遇到这种情况时我的代码将停止。我想要以下。

  • 如果代码名称不正确,则跳过该代码名称。
  • 列表中的每个元素都是一个数据框。我希望代码名称可以附加到元素数据框中的变量名称中。
  • 我需要一种有效的方法来创建一个以收盘价作为变量的数据框。

  • 这是我的问题的简化版本的示例代码。
    library(tseries)
    tckk <- c("MSFT", "C", "VIA/B", "MMM") # ticker names defined
    numtk <- length(tckk);
    ustart <- "2000-12-30";
    uend <- "2007-12-30" # start and end date
    all_dat <- list(); # empty list to fill in the data
    for(i in 1:numtk)
    {
      all_dat[[i]] <- xxx <- get.hist.quote(instrument = tckk[i], start=ustart, end=uend, quote = c("Open", "High", "Low", "Close"), provider = "yahoo", compression = "m")
    }
    

    该代码在第三个条目处停止,但是我想跳过此代码,转到“MMM”。我听说过Trycatch()函数,但不知道如何使用它。

    对于问题2,我希望列表的第一个元素的变量名称为“MSFTopen”,“MSFThigh”,“MSFTlow”和“MSFTclose”。除了使用loop和paste()函数的组合之外,还有其他更好的方法吗?

    最后,对于问题3,我需要一个包含三列对应于收盘价的数据框。同样,我试图避免在这里出现循环。

    谢谢。

    最佳答案

    最好的选择是使用Quantmod并将结果存储为时间序列(在这种情况下,它将为xts):

    library(quantmod)
    library(plyr)
    symbols <- c("MSFT","C","VIA/B","MMM")
    
    #1
    l_ply(symbols, function(sym) try(getSymbols(sym)))
    symbols <- symbols[symbols %in% ls()]
    
    #2
    sym.list <- llply(symbols, get)
    
    #3
    data <- xts()
    for(i in seq_along(symbols)) {
        symbol <- symbols[i]
        data <- merge(data, get(symbol)[,paste(symbol, "Close", sep=".")])
    }
    

    关于r - 在R中下载Yahoo股票价格,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3507744/

    10-12 03:06