将 XTS 对象作为数据帧存储在 R 中的列表中

Store XTS objects as data frames in a list in R

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

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

我已尝试使用 dplyr 语法 select 感兴趣的列,但我的代码未能 select 列索引大于 2

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

这是我正在使用的代码,但我很难理解如何无法从我的 'fortified' 数据帧select 收盘价

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 对象转换为数据框时,我可以 select 感兴趣的列,但在循环遍历它们时却不能。

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

任何人都可以帮助我了解我对这个问题的理解在哪里吗?

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

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

由于这里的i是对象的字符串名称"AAPL""AMZN",我们可以用get到return那个的值来自全局环境的对象

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 将所有这些对象 return 放入 list

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

getSymbols 可以将股票数据放入环境 stocks 并且 Cl 将提取收盘价和指数。如果您想要调整后的收盘价,请将 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)))