将 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
可以将股票数据放入环境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)))
【讨论】:
【参考方案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 的列表中的主要内容,如果未能解决你的问题,请参考以下文章