【问题标题】:Store XTS objects as data frames in a list in R将 XTS 对象作为数据帧存储在 R 的列表中
【发布时间】:2021-04-04 19:29:40
【问题描述】:

我希望将一些 XTS 对象作为数据帧存储在 R 的列表中。

XTS 对象是使用 tidyquant 包收集的股票价格数据,我需要将这些对象转换为数据框并将它们存储在列表中。我有一个额外的要求,我只想保留每只股票的索引列和收盘价列。

我尝试使用 dplyr 语法来选择感兴趣的列,但我的代码无法选择大于 2 的列索引

Error: Can't subset columns that don't exist.
x Locations 3 and 4 don't exist.
i There are only 2 columns.

这是我正在使用的代码,但我很难理解为什么我无法从“强化”数据框中选择收盘价

pacman::p_load(tidyquant,tidyverse,prophet)

tickers = c("AAPL","AMZN")

getSymbols(tickers, 
           from = '2015-01-01',
           to = today(),
           warnings = FALSE,
           auto.assign = TRUE)

dfList <- list()

for (i in tickers) {
  dfList[[i]] <- fortify.zoo(i) %>% 
    select(c(1,5))
  }

当我使用 fortify.zoo 将单个 XTS 对象转换为数据框时,我可以选择感兴趣的列,但当我遍历它们时却不能。

fortify.zoo(AAPL) %>% select(c(1,5)) %>% head(n = 10)

谁能帮助我了解我对这个问题的理解在哪里下降?

【问题讨论】:

  • 我建议您使用Gabor's solution,它利用getSymbols()env 参数并使用eapply()lapply() 通过迭代环境来创建列表,提取 (调整)关闭,并将其强化为 data.frame。

标签: r list dplyr xts


【解决方案1】:

最好用固定长度初始化list,用tickers初始化name。在 OP 的代码中,它直接循环遍历 tickers,所以每个 'i' 都是代码名称,它是一个字符串

dfList <- vector('list', length(tickers))
names(dfList) <- tickers

由于这里的i 是对象"AAPL""AMZN" 的字符串名称,我们可以使用get 从全局环境中返回该对象的值

for (i in tickers) {
  dfList[[i]] <- fortify.zoo(get(i)) %>% 
             select(c(1,5))
   }

-检查尺寸

sapply(dfList, dim)
#    AAPL AMZN
#[1,] 1507 1507
#[2,]    2    2

另一种方法是mget 将所有这些对象返回到list

library(purrr)
library(dplyr)
dfList2 <-  mget(tickers) %>%
     map(~ fortify.zoo(.x) %>% 
             select(1, 5))

【讨论】:

    【解决方案2】:

    getSymbols 可以将股票数据放入环境stocksCl 将提取收盘和指数。如果您想要调整后的关闭,请将 Cl 替换为 Ad。然后遍历环境中的名称。最后将其保留为环境stocks 或可选择将其转换为列表L。除了 quantmod 和它引入的包之外,没有使用任何包。还有一个问题,您是否甚至需要将数据转换为数据帧。您可以将其保留为 xts。

    library(quantmod)
    tickers = c("AAPL","AMZN")
    
    stocks <- new.env()
    getSymbols(tickers, env = stocks, from = '2015-01-01')
    
    for(nm in ls(stocks)) stocks[[nm]] <- fortify.zoo(Cl(stocks[[nm]]))
    
    L <- as.list(stocks) # optional
    

    如果您确实想要一个列表,另一种可能性是将最后两行替换为 eapply:

    L <- eapply(stocks, function(x) fortify.zoo(Cl(x)))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-17
      • 2016-01-07
      • 2017-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-25
      相关资源
      最近更新 更多