将多个现有 xts 对象转换为多个 data.frames
Converting Multiple existing xts objects to multiple data.frames
已经有一个线程询问如何将多个 xts
对象转换为多个 data.frames here. Unfortunately, the solutions show how to do it for data that is being downloaded in .GlobalEnv
. Moreover, the first answer 提到的线程建议创建一个新环境,将对象下载到其中,并使用以下代码转换内部的所有内容:stocks <- eapply(dataEnv, as.data.frame)
.
但是,这会创建一个存储在变量 stocks
中的大列表,而我需要对象保持离散。即使我 运行 代码没有生成列表(即仅应用 eapply(dataEnv, as.data.frame)
),也没有任何反应。这已记录在案 . In order to update the original object, the 这个问题是使用如下代码:NKLA <- fortify.zoo(NKLA)
。顺便说一句,这个解决方案适用于一些可以手动完成的对象,我需要自动化这个过程。
在我的例子中,对象已经下载,其中一些是 data.frames
,一些是 xts
个对象,甚至可能还有其他对象。
我需要的是找到 xts
对象并将它们转换为 data.frames
.
为了找到 xts
对象,我使用以下代码:xtsObjects <- which(unlist(eapply(.GlobalEnv, is.xts)))
,但应用 xtsObjects <- fortify.zoo(xtsObjects)
只会创建另一个名为 xtsObjects
的对象,其中包含,例如,2 个观测值。 2 个变量(因为环境中有 2 个 xts
个对象)。
例如,以下代码(应该是可重现的)不会将离散 xts
对象更改为离散 data.frames
:
library(quantmod)
library(zoo)
tickers <- c("TSLA", "RMO", "TSM", "PDD")
getSymbols.yahoo(tickers, auto.assign = TRUE, env = globalenv())
xtsObjects <- which(unlist(eapply(.GlobalEnv, is.xts)))
# This does not do anything:
for (i in 1:length(xtsObjects)) fortify.zoo(xtsObjects[i])
我的问题:
- 我可以使用什么循环(或任何代码)来同时将原始 loaded/existing
xts
个对象更新为 data.frame
个对象?
使用的系统:
- R版本:4.1.1 (2021-08-10)
- RStudio 版本:1.4.1717
- OS: macOS Catalina 版本 10.15.7
使用names(which())
然后lapply
。
xtsObjects <- names(which(unlist(eapply(.GlobalEnv, is.xts))))
res <- lapply(mget(xtsObjects), fortify.zoo)
head(res[[1]])
# Index RMO.Open RMO.High RMO.Low RMO.Close RMO.Volume RMO.Adjusted
# 1 2019-04-01 9.80 9.80 9.75 9.75 161000 9.75
# 2 2019-04-02 9.75 9.75 9.75 9.75 11000 9.75
# 3 2019-04-03 9.75 9.75 9.75 9.75 0 9.75
# 4 2019-04-04 9.76 9.76 9.76 9.76 1000 9.76
# 5 2019-04-05 9.78 9.78 9.75 9.75 100600 9.75
# 6 2019-04-08 9.76 9.76 9.76 9.76 20500 9.76
length(res)
# [1] 4
names(res)
# [1] "RMO" "TSM" "TSLA" "PDD"
要将生成的数据框直接放入工作区,请使用 list2env
。
list2env(lapply(mget(xtsObjects), fortify.zoo))
ls() ## list objects currently in workspace
# [1] "PDD" "RMO" "tickers" "TSLA" "TSM" "xtsObjects"
通过用 which
换行,它只是 returns 对象 names
的位置,而不是实际对象。我们可能需要从 'xtsObjects' 输出中 get
具有 names
的对象的值(mget
- returns list
,然后用 map
遍历 list
并转换为 data.frame
)
library(dplyr)
library(purrr)
out <- mget(names(xtsObjects)) %>%
map(fortify.zoo)
-输出
> str(out)
List of 4
$ PDD :'data.frame': 793 obs. of 7 variables:
..$ Index : Date[1:793], format: "2018-07-26" "2018-07-27" "2018-07-30" "2018-07-31" ...
..$ PDD.Open : num [1:793] 26.5 27.5 23.3 22.2 19.4 ...
..$ PDD.High : num [1:793] 27.5 27.5 23.9 22.7 21.4 ...
..$ PDD.Low : num [1:793] 25 23.2 21.9 19.6 18.6 ...
..$ PDD.Close : num [1:793] 26.7 24.6 22.5 22.6 20.3 ...
..$ PDD.Volume : num [1:793] 43213200 19923300 13967700 13709600 19339000 ...
..$ PDD.Adjusted: num [1:793] 26.7 24.6 22.5 22.6 20.3 ...
$ RMO :'data.frame': 623 obs. of 7 variables:
..$ Index : Date[1:623], format: "2019-04-01" "2019-04-02" "2019-04-03" "2019-04-04" ...
..$ RMO.Open : num [1:623] 9.8 9.75 9.75 9.76 9.78 9.76 9.76 9.77 9.74 9.74 ...
..$ RMO.High : num [1:623] 9.8 9.75 9.75 9.76 9.78 9.76 9.76 9.77 9.74 9.74 ...
..$ RMO.Low : num [1:623] 9.75 9.75 9.75 9.76 9.75 9.76 9.76 9.77 9.74 9.74 ...
..$ RMO.Close : num [1:623] 9.75 9.75 9.75 9.76 9.75 9.76 9.76 9.77 9.74 9.74 ...
..$ RMO.Volume : num [1:623] 161000 11000 0 1000 100600 ...
..$ RMO.Adjusted: num [1:623] 9.75 9.75 9.75 9.76 9.75 9.76 9.76 9.77 9.74 9.74 ...
$ TSLA:'data.frame': 2826 obs. of 7 variables:
..$ Index : Date[1:2826], format: "2010-06-29" "2010-06-30" "2010-07-01" "2010-07-02" ...
..$ TSLA.Open : num [1:2826] 3.8 5.16 5 4.6 4 ...
..$ TSLA.High : num [1:2826] 5 6.08 5.18 4.62 4 ...
..$ TSLA.Low : num [1:2826] 3.51 4.66 4.05 3.74 3.17 ...
..$ TSLA.Close : num [1:2826] 4.78 4.77 4.39 3.84 3.22 ...
..$ TSLA.Volume : num [1:2826] 93831500 85935500 41094000 25699000 34334500 ...
..$ TSLA.Adjusted: num [1:2826] 4.78 4.77 4.39 3.84 3.22 ...
$ TSM :'data.frame': 3704 obs. of 7 variables:
..$ Index : Date[1:3704], format: "2007-01-03" "2007-01-04" "2007-01-05" "2007-01-08" ...
..$ TSM.Open : num [1:3704] 11.1 10.9 10.8 10.6 10.8 ...
..$ TSM.High : num [1:3704] 11.1 11 10.8 10.8 10.8 ...
..$ TSM.Low : num [1:3704] 10.8 10.7 10.5 10.6 10.5 ...
..$ TSM.Close : num [1:3704] 10.9 10.9 10.6 10.7 10.6 ...
..$ TSM.Volume : num [1:3704] 12438784 17678653 12691240 5477350 7396096 ...
..$ TSM.Adjusted: num [1:3704] 6.38 6.38 6.21 6.25 6.17 ...
关于 for
循环没有任何问题,1) 它只是试图对对象名称而不是值执行 fortify.zoo
,2) 即使它是应用 fortify.zoo
的值,应将其分配回原始对象,即如果我们要更新原始对象名称,请使用 assign
for (i in seq_along(xtsObjects)) {
assign(names(xtsObjects[i]), fortify.zoo(get(names(xtsObjects[i]))))
}
已经有一个线程询问如何将多个 xts
对象转换为多个 data.frames here. Unfortunately, the solutions show how to do it for data that is being downloaded in .GlobalEnv
. Moreover, the first answer 提到的线程建议创建一个新环境,将对象下载到其中,并使用以下代码转换内部的所有内容:stocks <- eapply(dataEnv, as.data.frame)
.
但是,这会创建一个存储在变量 stocks
中的大列表,而我需要对象保持离散。即使我 运行 代码没有生成列表(即仅应用 eapply(dataEnv, as.data.frame)
),也没有任何反应。这已记录在案 NKLA <- fortify.zoo(NKLA)
。顺便说一句,这个解决方案适用于一些可以手动完成的对象,我需要自动化这个过程。
在我的例子中,对象已经下载,其中一些是 data.frames
,一些是 xts
个对象,甚至可能还有其他对象。
我需要的是找到 xts
对象并将它们转换为 data.frames
.
为了找到 xts
对象,我使用以下代码:xtsObjects <- which(unlist(eapply(.GlobalEnv, is.xts)))
,但应用 xtsObjects <- fortify.zoo(xtsObjects)
只会创建另一个名为 xtsObjects
的对象,其中包含,例如,2 个观测值。 2 个变量(因为环境中有 2 个 xts
个对象)。
例如,以下代码(应该是可重现的)不会将离散 xts
对象更改为离散 data.frames
:
library(quantmod)
library(zoo)
tickers <- c("TSLA", "RMO", "TSM", "PDD")
getSymbols.yahoo(tickers, auto.assign = TRUE, env = globalenv())
xtsObjects <- which(unlist(eapply(.GlobalEnv, is.xts)))
# This does not do anything:
for (i in 1:length(xtsObjects)) fortify.zoo(xtsObjects[i])
我的问题:
- 我可以使用什么循环(或任何代码)来同时将原始 loaded/existing
xts
个对象更新为data.frame
个对象?
使用的系统:
- R版本:4.1.1 (2021-08-10)
- RStudio 版本:1.4.1717
- OS: macOS Catalina 版本 10.15.7
使用names(which())
然后lapply
。
xtsObjects <- names(which(unlist(eapply(.GlobalEnv, is.xts))))
res <- lapply(mget(xtsObjects), fortify.zoo)
head(res[[1]])
# Index RMO.Open RMO.High RMO.Low RMO.Close RMO.Volume RMO.Adjusted
# 1 2019-04-01 9.80 9.80 9.75 9.75 161000 9.75
# 2 2019-04-02 9.75 9.75 9.75 9.75 11000 9.75
# 3 2019-04-03 9.75 9.75 9.75 9.75 0 9.75
# 4 2019-04-04 9.76 9.76 9.76 9.76 1000 9.76
# 5 2019-04-05 9.78 9.78 9.75 9.75 100600 9.75
# 6 2019-04-08 9.76 9.76 9.76 9.76 20500 9.76
length(res)
# [1] 4
names(res)
# [1] "RMO" "TSM" "TSLA" "PDD"
要将生成的数据框直接放入工作区,请使用 list2env
。
list2env(lapply(mget(xtsObjects), fortify.zoo))
ls() ## list objects currently in workspace
# [1] "PDD" "RMO" "tickers" "TSLA" "TSM" "xtsObjects"
通过用 which
换行,它只是 returns 对象 names
的位置,而不是实际对象。我们可能需要从 'xtsObjects' 输出中 get
具有 names
的对象的值(mget
- returns list
,然后用 map
遍历 list
并转换为 data.frame
)
library(dplyr)
library(purrr)
out <- mget(names(xtsObjects)) %>%
map(fortify.zoo)
-输出
> str(out)
List of 4
$ PDD :'data.frame': 793 obs. of 7 variables:
..$ Index : Date[1:793], format: "2018-07-26" "2018-07-27" "2018-07-30" "2018-07-31" ...
..$ PDD.Open : num [1:793] 26.5 27.5 23.3 22.2 19.4 ...
..$ PDD.High : num [1:793] 27.5 27.5 23.9 22.7 21.4 ...
..$ PDD.Low : num [1:793] 25 23.2 21.9 19.6 18.6 ...
..$ PDD.Close : num [1:793] 26.7 24.6 22.5 22.6 20.3 ...
..$ PDD.Volume : num [1:793] 43213200 19923300 13967700 13709600 19339000 ...
..$ PDD.Adjusted: num [1:793] 26.7 24.6 22.5 22.6 20.3 ...
$ RMO :'data.frame': 623 obs. of 7 variables:
..$ Index : Date[1:623], format: "2019-04-01" "2019-04-02" "2019-04-03" "2019-04-04" ...
..$ RMO.Open : num [1:623] 9.8 9.75 9.75 9.76 9.78 9.76 9.76 9.77 9.74 9.74 ...
..$ RMO.High : num [1:623] 9.8 9.75 9.75 9.76 9.78 9.76 9.76 9.77 9.74 9.74 ...
..$ RMO.Low : num [1:623] 9.75 9.75 9.75 9.76 9.75 9.76 9.76 9.77 9.74 9.74 ...
..$ RMO.Close : num [1:623] 9.75 9.75 9.75 9.76 9.75 9.76 9.76 9.77 9.74 9.74 ...
..$ RMO.Volume : num [1:623] 161000 11000 0 1000 100600 ...
..$ RMO.Adjusted: num [1:623] 9.75 9.75 9.75 9.76 9.75 9.76 9.76 9.77 9.74 9.74 ...
$ TSLA:'data.frame': 2826 obs. of 7 variables:
..$ Index : Date[1:2826], format: "2010-06-29" "2010-06-30" "2010-07-01" "2010-07-02" ...
..$ TSLA.Open : num [1:2826] 3.8 5.16 5 4.6 4 ...
..$ TSLA.High : num [1:2826] 5 6.08 5.18 4.62 4 ...
..$ TSLA.Low : num [1:2826] 3.51 4.66 4.05 3.74 3.17 ...
..$ TSLA.Close : num [1:2826] 4.78 4.77 4.39 3.84 3.22 ...
..$ TSLA.Volume : num [1:2826] 93831500 85935500 41094000 25699000 34334500 ...
..$ TSLA.Adjusted: num [1:2826] 4.78 4.77 4.39 3.84 3.22 ...
$ TSM :'data.frame': 3704 obs. of 7 variables:
..$ Index : Date[1:3704], format: "2007-01-03" "2007-01-04" "2007-01-05" "2007-01-08" ...
..$ TSM.Open : num [1:3704] 11.1 10.9 10.8 10.6 10.8 ...
..$ TSM.High : num [1:3704] 11.1 11 10.8 10.8 10.8 ...
..$ TSM.Low : num [1:3704] 10.8 10.7 10.5 10.6 10.5 ...
..$ TSM.Close : num [1:3704] 10.9 10.9 10.6 10.7 10.6 ...
..$ TSM.Volume : num [1:3704] 12438784 17678653 12691240 5477350 7396096 ...
..$ TSM.Adjusted: num [1:3704] 6.38 6.38 6.21 6.25 6.17 ...
关于 for
循环没有任何问题,1) 它只是试图对对象名称而不是值执行 fortify.zoo
,2) 即使它是应用 fortify.zoo
的值,应将其分配回原始对象,即如果我们要更新原始对象名称,请使用 assign
for (i in seq_along(xtsObjects)) {
assign(names(xtsObjects[i]), fortify.zoo(get(names(xtsObjects[i]))))
}