我希望将一些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
可以将股票数据放入环境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)))
最好用tickers
初始化一个固定长度的list
和name
。在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))