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