【问题标题】:Change String into name to access dataframe (R)将字符串更改为名称以访问数据框(R)
【发布时间】:2017-04-26 10:29:21
【问题描述】:

又是 R-Beginner。

我有以下问题:我有一个包含字符串的向量,用于通过 quantmod 的GetSymbols() 获取一些数据帧:

library(quantmod)
tickers = c("GOOG", "XOM", "GE", "KO", "F", "GS", "AIG", "HPQ", "WMT", "MSI")
n = length(tickers)



for (i in 1:n){
    getSymbols(Symbols = tickers[i], from=start, to=end, src="yahoo")

现在我的问题如下:我想访问此循环中的特定数据框,并可能在它自己的向量中提取它的“.Close”列。 我尝试了以下(以及其他几次尝试):

   adress = tickers[i]
   price.[i]  = cbind(adress[,4])


}

但显然它不起作用,因为地址只是一个字符串。 所以我的问题是,如何将字符串转换为另一种数据类型,该“函数”以循环仍然有效的方式处理 GetSymbols 之前创建的数据帧;我的下一个问题是price.[i] 上的迭代是否有效,所以我有 n 个向量,每个向量都有不同的名称?

所有这一切背后的意义是抽象我迄今为止创建的脚本,无论我有多少符号,当我使用例如 dygraph 或 rCharts 时,我不必为每个符号做工作或其他任何东西,然后将完成提供所有股票收盘价图表的脚本。

我希望我的语言是可以理解的。我也原谅自己,这可能是一个愚蠢的问题,因为我仍然是一名 R 初学者,试图为我的新工作进入这个领域;

感谢你们阅读和帮助我。祝你有美好的一天。

【问题讨论】:

    标签: r string loops quantmod


    【解决方案1】:

    我同意列表是要走的路。但是我会避免使用循环。试试这个:

    tickers = c("GOOG", "XOM", "GE", "KO", "F", "GS", "AIG", "HPQ", "WMT", "MSI")
    getSymbols(tickers, from = start, end = end)
    

    如果您想要矩阵中的价格:

    prices = do.call(merge, lapply(tickers, function(x) Cl(get(x)))
    names(prices) = tickers
    

    或者如果您希望价格作为矢量:

    prices = lapply(tickers, function(x) get(x))
    names(prices) = tickers
    

    【讨论】:

    • 感谢您的所有回答,非常感谢!这个最适合我将我的结果用于 dygraph。非常感谢你们!
    【解决方案2】:

    首先,注意getSymbols 默认不返回data.frame。它返回一个 xts 对象,它是一个具有基于时间的索引的矩阵。

    解决问题的推荐方法是在代码上使用lapply 创建一个列表。这是一个创建命名列表的示例。请注意,您需要设置auto.assign = FALSE 以使getSymbols 返回数据,而不是加载数据。

    library(quantmod)
    tickers <- c("GOOG", "XOM", "GE", "KO", "F", "GS", "AIG", "HPQ", "WMT", "MSI")
    
    # A named list
    Data <- setNames(lapply(tickers, getSymbols, src = "yahoo", auto.assign = FALSE), tickers)
    # Use lapply again to extract the close for each symbol
    Close <- lapply(Data, Cl)
    # Accessing a specific ticker's data
    head(Close[[tickers[1]]])
    

    【讨论】:

      【解决方案3】:

      这是使用tidyquant 包的替代方法。我相信这正是您所需要的:使用对tq_get() 的简洁调用获取数据框中每只股票的价格(或整洁数据框的“tibble”),然后设置您对组执行分析使用group_by() 函数处理数据框。


      library(tidyquant)
      
      tickers <- c("GOOG", "XOM", "GE", "KO", "F", "GS", "AIG", "HPQ", "WMT", "MSI")
      stock_prices <- tq_get(tickers, 
                             get  =  "stock.prices", 
                             from = "2016-01-01", 
                             to   = "2016-12-31")
      stock_prices %>%
          group_by(symbol) 
      #> Source: local data frame [2,520 x 8]
      #> Groups: symbol [10]
      #> 
      #>    symbol       date   open    high     low  close  volume adjusted
      #>     <chr>     <date>  <dbl>   <dbl>   <dbl>  <dbl>   <dbl>    <dbl>
      #> 1    GOOG 2016-01-04 743.00 744.060 731.258 741.84 3272800   741.84
      #> 2    GOOG 2016-01-05 746.45 752.000 738.640 742.58 1950700   742.58
      #> 3    GOOG 2016-01-06 730.00 747.180 728.920 743.62 1947000   743.62
      #> 4    GOOG 2016-01-07 730.31 738.500 719.060 726.39 2963700   726.39
      #> 5    GOOG 2016-01-08 731.45 733.230 713.000 714.47 2450900   714.47
      #> 6    GOOG 2016-01-11 716.61 718.855 703.540 716.03 2090600   716.03
      #> 7    GOOG 2016-01-12 721.68 728.750 717.317 726.07 2024500   726.07
      #> 8    GOOG 2016-01-13 730.85 734.740 698.610 700.56 2501700   700.56
      #> 9    GOOG 2016-01-14 705.38 721.925 689.100 714.72 2225800   714.72
      #> 10   GOOG 2016-01-15 692.29 706.740 685.370 694.45 3592400   694.45
      #> # ... with 2,510 more rows
      

      【讨论】:

        【解决方案4】:

        一开始,我对如何操作对象(例如,像 SPY 这样的 xts 对象)而不是表示对象的字符串(“SPY”)进行操作感到困惑,反之亦然。

        这里有 2 个函数可以解决这个问题:

        Str2Obj <- function(aString)   {eval(parse(text=aString))}
        
        Obj2Str <- function(anObjName) {deparse(substitute(anObjName))}
        

        例如,从使用 GetSymbols 下载的资产中提取数据并返回 xts 对象:

        getAssetPrices <- function(assetNames, 
                          select = c("Ad","Cl","Op","Hi","Lo","Vo")) { #1
         worker <- function(assetName, select) { #2 
              asset <- Str2Obj(assetName)
              switch(select,
                       "Ad" = Ad(asset),"Cl" = Cl(asset),
                       "Op" = Op(asset),"Hi" = Hi(asset),
                       "Lo" = Lo(asset),"Vo" = Vo(asset)
                     )
              } #2
         lapply(assetNames, worker, select[1]) %>% do.call(merge.xts, .)
        } #1
        
        prices <- getAssetPrices(c("AAPL","ADBE","ADSK"), select = "Ad")
        
        head(prices,3)
        
        #               AAPL.Adjusted ADBE.Adjusted ADSK.Adjusted
        # 1995-01-03        1.2239        3.5876        8.7046
        # 1995-01-04        1.2558        3.4890        8.9666
        # 1995-01-05        1.2398        3.6255        8.9666
        

        Str2Obj 和 Obj2Str 适用于任何名称 对象转换。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-09-05
          • 2022-10-14
          • 1970-01-01
          • 1970-01-01
          • 2022-01-03
          • 2021-07-26
          • 2013-03-02
          相关资源
          最近更新 更多