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

Posted

技术标签:

【中文标题】将 XTS 对象作为数据帧存储在 R 的列表中【英文标题】:Store XTS objects as data frames in a list in R 【发布时间】:2022-01-22 08:37:24 【问题描述】:

我希望将一些 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。 【参考方案1】:

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)))

【讨论】:

【参考方案2】:

最好用固定长度初始化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))

【讨论】:

以上是关于将 XTS 对象作为数据帧存储在 R 的列表中的主要内容,如果未能解决你的问题,请参考以下文章

R列表/数据帧到JSON对象数组

如何在 R 中对财务数据 xts 对象进行简单和滚动线性回归?

将数据帧列表转换为R中的单个数据帧[重复]

如何在 R 中更改时间序列(XTS 或 ZOO)?

R语言时间序列数据应用xts

R如何排列数据帧的所有行,以便在列表中返回所有可能的行组合?