【问题标题】:How to combine multiple timeseries dataframe with varying length in R?如何在R中组合具有不同长度的多个时间序列数据帧?
【发布时间】:2016-09-04 10:23:39
【问题描述】:

我有一个非常大的时间序列 (xts) 数据框变量 (>10),其中包含不同数量的行、天以及开始和结束日期。我想将这些数据框组合为一个时间序列数据框。

为了清楚起见,我举个例子;考虑 A、B 和 C 时间序列数据框,其日期分别为 100,200 和 300 行,对应的值为一列。

A              Result                B          Result      C               Result
2014-02-01  0.8478517865        2016-03-01  0.794655429     2014-02-01  0.5961746441
2015-03-02  0.8310818302        2016-03-02  0.4288015561    2014-08-03  0.4332428675
2015-04-13  0.6525838461        2016-03-04  0.8032966915    2015-03-01  0.4675749368
2015-04-27  0.0078298878        2016-03-06  0.588762206     2015-03-02  0.6404606516
2015-05-05  0.4810352649        2016-03-08  0.8551481313    2016-03-01  0.403449801
2015-05-06  0.2730398192        2016-03-10  0.7437164122    2016-03-09  0.1844344875
2015-05-07  0.5594211367        2016-03-11  0.1973790985            
2015-05-08  0.1888440552        2016-03-13  0.5973634648            
2015-05-09  0.8211225735                        
2015-05-10  0.2937804316                        
2015-05-11  0.4311328372                        

如何将这三个时间序列数据框与一列组合为一个具有 3 列的数据框?

我尝试使用 cbind(A,B) 但它给出了这个错误

data.frame(..., check.names = FALSE) 中的错误:参数暗示 不同的行数:

还使用 rbind.fill(A,B) 尝试了这个answer,但它附加了时间序列数据框

A=100 的行,一列

一行 B=200,一列

rbind.fill 后行数 300 列 1

已编辑

这个代码是从这个answer获取的。

cbind.fill <- function(...){
    nm <- list(...) 
    nm <- lapply(nm, as.matrix)
    n <- max(sapply(nm, nrow)) 
    do.call(cbind, lapply(nm, function (x) 
        rbind(x, matrix(, n-nrow(x), ncol(x))))) 
}

这个函数结合了两个 xts 数据框,但它没有正确对齐数据和日期

comb-cbind.fill(A,B)
head(comb)
1998-01-02 "0.332" "0.849"
1998-01-05 "0.227" "0.060"
1998-01-06 "0.394" "0.071"
1998-01-07 "0.422" "6.066"
tail(comb)
 NA    "0.306"
 NA    "0.479"
 NA    "0.127"
 NA    "0.321"

【问题讨论】:

  • 你不能有一个列长度不同的数据框,
  • 在这种情况下您可能需要使用列表
  • 你说你有几个“xts 数据框变量”。那是不可能的。它们必须是 xts 对象或 data.frame 对象。 xts 对象是具有索引属性的矩阵;它们不能是 data.frame。如果你真的有 3 个 xts 对象,答案很简单:merge(A, B, C)
  • @JoshuaUlrich 抱歉,因为英语不是我的第一语言,所以造成任何混淆。当您在 quantmod 中工作时,我将给出我的 variables A&lt;-Cl(aapl), B&lt;-Cl(goog), C&lt;-Cl(f), D.. 的类似示例
  • 您不应将解决方案编辑到您的问题中(我已将其删除)。您可以回答自己的问题并将其标记为已接受。

标签: r xts


【解决方案1】:

按照 Joshua 的建议,我将为我的问题编写解决方案。

问题在于我的一个代码本身将我的时间序列转换为数据框。我使用is.data.frame()调试了这个问题

is.data.frame(A)
TRUE

删除导致问题的函数解决了错误,然后我使用 cbind(A,B) 组合了不同长度的时间序列

【讨论】:

    【解决方案2】:

    也许我们可以使用merge。由于时间列被用作合并索引,那么:

    merge(A,B, all = TRUE, by.x = "A", by.y = "B")
    

    如果 A$A 列 (100) 中的所有日期都是 B$B 列 (200) 的成员,那么您将获得 200 行和 3 列(1 个日期和 2 个数据)。我假设日期存储在单独的列中。

    【讨论】:

    • 它只是将行和列以不同的排列和组合组合在一起,以提供甚至大于 300 的行数
    • 所以您希望列号仍为 300?这是否意味着所有数据框的日期都是通用的?
    • 不,A 有 100 行 B 有 200 行,两者都有一列;将 A 和 B 结合起来,这样就可以创建一个包含两列的新时间序列数据帧(时间对齐)。
    • 错误error in fix.by(by.x, x) : 'by' must specify a uniquely valid column
    • 包含日期信息的数据框的列名是什么?
    猜你喜欢
    • 2014-04-12
    • 1970-01-01
    • 2020-03-18
    • 1970-01-01
    • 2021-10-04
    • 2021-11-20
    • 1970-01-01
    • 2018-03-23
    • 2015-07-25
    相关资源
    最近更新 更多