gpt4 book ai didi

r - 动态合并带后缀的 xts 对象

转载 作者:行者123 更新时间:2023-12-02 18:16:09 25 4
gpt4 key购买 nike

任务是将多个 xts 对象动态合并为一个带有后缀的大 blob,其中后缀本质上是 xts 对象的列名称。

示例数据:

library(xts)
a <- data.frame(alpha=1:10, beta=2:11)
xts1 <- xts(x=a, order.by=Sys.Date() - 1:10)
b <- data.frame(alpha=3:12, beta=4:13)
xts2 <- xts(x=b, order.by=Sys.Date() - 1:10)
c <- data.frame(alpha=5:14, beta=6:15)
xts3 <- xts(x=c, order.by=Sys.Date() - 1:10)

静态合并方式:

$> merge.zoo(xts1, xts2, xts3, suffixes=c("A", "B", "C"))
# output
alpha.A beta.A alpha.B beta.B alpha.C beta.C
2022-03-11 10 11 12 13 14 15
2022-03-12 9 10 11 12 13 14
2022-03-13 8 9 10 11 12 13
2022-03-14 7 8 9 10 11 12
2022-03-15 6 7 8 9 10 11
2022-03-16 5 6 7 8 9 10
2022-03-17 4 5 6 7 8 9
2022-03-18 3 4 5 6 7 8
2022-03-19 2 3 4 5 6 7
2022-03-20 1 2 3 4 5 6

我可能有超过 3 个 xts 对象,而 3 个只是任意演示。

我尝试过 do.call 但我的 do.call 尝试在没有后缀的情况下失败了,因为我无法将 3 个 xts 对象包装到数据结构中do.call 将其作为列表接受(在 R 语言中,它应该是包含 3 个项目的向量)。

do.call 演示:

# do.call with xts objects as separate args and suffixes, works
do.call(merge.zoo, list(xts1, xts2, xts3, suffixes=c("A", "B", "C")))

# do.call with xts objects wrapped up as list and suffixes, failed

# because R takes each element of list as vector and essentially a list of xts objects is a list of 3 lists, each of which has a xts object.

xts.list <- list(xts1, xts2, xts3)

# check data type
class(xts.list[[1]]) # output: xts,zoo
class(xts.list[1]) # output: list

# do.call failed attempt
do.call(merge.zoo, list(xts.list, suffixes=c("A", "B", "C")))
# Error Message
Error in zoo(structure(x, dim = dim(x)), index(x), ...) :
“x” : attempt to define invalid zoo object

换句话说,如果我可以将列表解压缩为动态数量的参数,我就能让这个想法发挥作用;但是我似乎找不到一种方法来解压 R 中的参数或其他一些解决方案。

免责声明:我试图解决的最终问题是最终能够在多面板 View 中绘制时间序列数据; ggplot 不适用于我每天使用的大多数软件包。

免责声明 2:merge.xts 忽略后缀(一个错误),merge.zoo 是可行的替代方案。欲了解更多信息,请查看here

最佳答案

我们可以传递列表中的所有内容,即

library(zoo)
c(xts.list, list(suffixes=c("A", "B", "C")))

现在,使用do.call中的merge

do.call(merge.zoo, c(xts.list, list(suffixes=c("A", "B", "C"))))

-输出

            alpha.A beta.A alpha.B beta.B alpha.C beta.C
2022-03-11 10 11 12 13 14 15
2022-03-12 9 10 11 12 13 14
2022-03-13 8 9 10 11 12 13
2022-03-14 7 8 9 10 11 12
2022-03-15 6 7 8 9 10 11
2022-03-16 5 6 7 8 9 10
2022-03-17 4 5 6 7 8 9
2022-03-18 3 4 5 6 7 8
2022-03-19 2 3 4 5 6 7
2022-03-20 1 2 3 4 5 6

请注意,merge 的第一个参数是可变参数组件(... - 它可以接受一个或多个 xts 数据,其中所有其他组件都被命名为和这就是我们仅为这些组件(即后缀)创建带有名称列表的原因。根据?merge

merge(...,all = TRUE,fill = NA,suffixes = NULL,join = "outer",retside = TRUE,retclass = "xts",tzone = NULL,drop=NULL,check.names=NULL)

因此,当我们想要附加一个 listxts.list 与另一个列表元素时,请将第二个命名向量包装在 list 中然后只需concatenate。类似于

> c(list(1), list(a = 1, b = 2))
[[1]]
[1] 1

$a
[1] 1

$b
[1] 2

而不是以下内容,因为这会创建一个嵌套的列表

> list(list(1), list(a = 1, b = 2))
[[1]]
[[1]][[1]]
[1] 1


[[2]]
[[2]]$a
[1] 1

[[2]]$b
[1] 2

关于r - 动态合并带后缀的 xts 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71560163/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com