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



我希望将一些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))
}

当我使用强化.zoo将一个单独的XTS对象转换为数据帧时,我可以选择感兴趣的列,但当我循环遍历它们时就不能了。

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

有人能帮助我理解我在这个问题上的理解吗?

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

最好用tickers初始化一个固定长度的listname。在OP的代码中,它直接在tickers上循环,因此每个"i"都是一个字符串的股票代码名称

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

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

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

最新更新