【问题标题】:Merging many lists of different XTS objects in R在 R 中合并许多不同 XTS 对象的列表
【发布时间】:2022-01-25 14:48:23
【问题描述】:

我有 3 个大型 XTS 对象列表:“SMA”; “L”、“丸子”。快速看看它的外观:

> names(Marubozu)
 [1] "TSLA"  "AAPL"  "NTES"  "GOOGL" "ASML"  "GOOG"  "NFLX"  "ADBE"  "AMZN"  "MSFT"  "ADI"   "FB"   
> names(SMA)
 [1] "TSLA"  "AAPL"  "NTES"  "GOOGL" "ASML"  "GOOG"  "NFLX"  "ADBE"  "AMZN"  "MSFT"  "ADI"   "FB"   
> names(L)
 [1] "TSLA"  "AAPL"  "NTES"  "GOOGL" "ASML"  "GOOG"  "NFLX"  "ADBE"  "AMZN"  "MSFT"  "ADI"   "FB"

> head(Marubozu$AAPL, n = 2)
           WhiteMarubozu BlackMarubozu
2000-01-03         FALSE         FALSE
2000-01-04         FALSE         FALSE
> head(SMA$AAPL, n = 2)
           UpTrend NoTrend DownTrend Trend
2000-01-03      NA      NA        NA    NA
2000-01-04      NA      NA        NA    NA
> head(L$AAPL, n =2)
           AAPL.Open AAPL.High AAPL.Low AAPL.Close AAPL.Volume AAPL.Adjusted
2000-01-03  0.936384  1.004464 0.907924   0.999442   535796800      0.856887
2000-01-04  0.966518  0.987723 0.903460   0.915179   512377600      0.784643   

我想在该列表中合并相应的 XTS 对象,以便创建一个大的 lig 列表。例如,New_List$AAPL 的输出将是:

AAPL.Open AAPL.High AAPL.Low AAPL.Close AAPL.Volume AAPL.Adjusted WhiteMarubozu BlackMarubozu UpTrend NoTrend DownTrend Trend
2000-01-03  0.936384  1.004464 0.907924   0.999442   535796800      0.856887             0             0      NA      NA        NA    NA
2000-01-04  0.966518  0.987723 0.903460   0.915179   512377600      0.784643             0             0      NA      NA        NA    NA

我试图创建一个列表列表并将其合并,但它不起作用。在这里你可以看到:

#That works for a single ticker AAPL      
full <- merge.xts(L$AAPL, Marubozu$AAPL, SMA$AAPL)

#This doesn't work
out3 <- Map(function(x) {full$x <- merge.xts(lista[[1]]$x, lista[[2]]$x)}, lista)

我猜这只是一些简单的两行代码,但无法真正找到解决方案,感谢您的回复!

【问题讨论】:

  • 这里的lista 是什么?我假设您的列表是MarubozuSMAL?在Map 代码中,xlista 的元素。因此,lista[[1]]$x 不起作用
  • 如果你想合并'L'、'Marubozu'和'SMA'的对应元素,代码将是Map(merge.xts, L, Marubozu, SMA)(基于适用于单个股票代码的代码-并假设所有代码的顺序相同)

标签: r merge xts


【解决方案1】:

这是一个小函数u(),它将xts-index 绑定到xts 对象并转换为'data.frame'

u <- function(x) cbind.data.frame(index=index(x), unclass(x))

为了测试它,我们使用sample_matrix 创建一些数据,xts 附带。我们将前两列和后两列拆分为具有相同索引的两个单独的xts 对象。

library(xts)
data(sample_matrix)
sample.xts <- as.xts(sample_matrix, descr='my new xts object')

S1 <- as.xts(sample_matrix[,1:2])  ##
S2 <- as.xts(sample_matrix[,3:4])

现在我们可以轻松地应用merge 并从中创建一个新的xts 对象。

res <- merge(u(S1), u(S2)) |>
  (\(x) xts(x[-1], x$index, descr='my new xts object'))()

class(res)
# [1] "xts" "zoo"

stopifnot(all.equal(res, sample.xts))  ## proof

【讨论】:

  • 有效!它肯定比 Akrun 的要长,但是学习新东西还是不错的。谢谢!
【解决方案2】:

我们可以使用Map 来做到这一点 - 因为xts 元素的list 具有相同的代码以相同的顺序,只需使用Map 而不是创建listlists

library(xts)
out <- Map(merge.xts, L, Marubozu, SMA)

【讨论】:

  • 这正是我想要的!实际上,我试图做同样的事情,但是方法不对。非常感谢!
  • @TechLuk 我是这么认为的。您正在包装 list 并尝试提取组件。使用该代码,它将是 x[[1]]x[[2]]x[[3]]
  • 没错。我知道我应该阅读更多关于 Map 函数和索引的内容
猜你喜欢
  • 2018-09-13
  • 2020-11-06
  • 1970-01-01
  • 2017-09-16
  • 1970-01-01
  • 2016-11-09
  • 1970-01-01
  • 2014-03-09
  • 2016-04-18
相关资源
最近更新 更多