r - 将多个现有 xts 对象转换为多个 data.frames

标签 r loops data-conversion

已经有一个线程询问如何转换多个 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/

相关文章:

r - 从计算的角度来看,有没有办法简化 $ADA^T$,其中 $D$ 是对角矩阵?

r - 如何向 Rmd 中的 xtable 添加复选标记。用于创建 pdf 的文件

r - 在 Stargazer 中显示 Akaike 标准

c - 当用户点击 'Enter' 时使用 getchar() 退出循环?

c++ - 带对象的循环 vector

java - 从用户获取一个字符串并将其字符放入二维数组中

具有大列表的 Python 结构

r - 如何提取匹配模式后出现的第一个数字

perl - 如何将带有重音符号、变音符号等的字母转换为 Perl 中的 ASCII 对应字母?

python - 如何从 QVariant 获取原始 python 数据