已经有一个线程询问如何转换多个 xts
对象放入尽可能多的 data.frames here 。不幸的是,解决方案展示了如何对 .GlobalEnv
中下载的数据执行此操作。 。此外,first answer上述线程建议创建一个新环境,将对象下载到其中,并使用以下代码转换其中的所有内容:stocks <- eapply(dataEnv, as.data.frame)
.
但是,这会创建一个存储在变量stocks
中的大列表。 ,而我需要对象保持离散。即使我运行代码而不生成列表(即,仅应用 eapply(dataEnv, as.data.frame)
),也不会发生任何情况。这已被记录here 。为了更新原始对象,answer这个问题是使用如下代码:NKLA <- fortify.zoo(NKLA)
。顺便说一句,这个解决方案有效,对于一些可以手动完成的对象来说是可以的,而我需要自动化该过程。
就我而言,对象已下载,其中一些是 data.frames
,有些是xts
对象,甚至可能还有其他对象。
我需要的是找到xts
对象并将其转换为data.frames
.
为了找到xts
对象,我使用以下代码:xtsObjects <- which(unlist(eapply(.GlobalEnv, is.xts)))
,但应用xtsObjects <- fortify.zoo(xtsObjects)
只创建另一个名为 xtsObjects
的对象例如,其中包含 2 个 obs。 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])
我的问题:
- 我可以使用什么循环(或任何代码)来同时更新原始的已加载/现有的
xts
对象进入data.frame
对象?
使用的系统:
- R版本:4.1.1(2021-08-10)
- RStudio 版本:1.4.1717
- 操作系统:macOS Catalina 版本 10.15.7
最佳答案
通过用 which
包装,它只返回带有对象的名称
的位置,而不是实际的对象。我们可能需要从“xtsObjects”输出中获取
具有名称
的对象的值(mget
- 返回多个对象的值一个 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]))))
}
关于r - 将多个现有 xts 对象转换为多个 data.frames,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69245999/