【问题标题】:Align multiple time series in R在 R 中对齐多个时间序列
【发布时间】:2017-11-22 12:20:14
【问题描述】:

我将一些时间序列导入 Excel,我有 20 列,每隔一列包含日期。 我希望只有一个日期列,所有数据都对齐,NA 不可用。

2007-06-11 1509 2007-06-11 1138 2008-01-17 990
2007-06-12 1493 2007-06-13 1200 2008-01-18 800
2007-06-13 1324 2007-06-14 1122 2008-01-19 880

应该给

2007-06-11 1509 1138 NA
2007-06-12 1493 NA   NA
2007-06-13 1324 1200 NA
...

谢谢!

【问题讨论】:

    标签: r date time-series


    【解决方案1】:

    将数据分解成片段,然后使用all.x = TRUE 选项将merge 加入片段(您可以使用Reduce 优雅地做到这一点)。

    dat <- read.table(sep=' ', text=
    '2007-06-11 1509 2007-06-11 1138 2008-01-17 990
    2007-06-12 1493 2007-06-13 1200 2008-01-18 800
    2007-06-13 1324 2007-06-14 1122 2008-01-19 880')
    
    #### break dat into appropriate pieces    
    # 1) alternating column indices
    col_idx <- seq(1, ncol(dat), by=2)    
    
    # 2) each piece is two columns
    dat_pieces <- lapply(col_idx, function(i) {
      dat_piece <- dat[, c(i, i+1)]
      # use common name for date columns
      names(dat_piece)[1] <- 'date'
      return(dat_piece)
    })
    
    #### merge all pieces
    my_new_thing <- Reduce(
      function(a, b) merge(a, b, by = 'date', all.x =T),
      dat_pieces)
    

    结果:

            date   V2   V4 V6
    1 2007-06-11 1509 1138 NA
    2 2007-06-12 1493   NA NA
    3 2007-06-13 1324 1200 NA
    

    【讨论】:

    • 它使用上面的示例数据集或其他数据集为您挂起?上面的运行对我来说没有问题,所以你不得不说更多关于如何重现你的错误
    • 不,真正的数据是一个更大的文件。我认为问题在于系列的长度,我将最长的 TS 作为第一列移动并且它可以工作,但它应该独立于列顺序工作
    • 在 data.frame 中,所有系列的定义长度相同。当您读入文件时,“较短”系列是否由 NA 填充?无论如何,看看你是否可以发布一个重新创建错误的示例数据集 - 你遇到的问题没有由上面的帖子表示。
    【解决方案2】:

    OP 已请求重新调整输入数据的日期/值对,以便列出每个日期的值。

    为此需要两个步骤:

    1. 同时将多个值列从宽格式调整为长格式
    2. 重新调整为宽格式,但只有一个日期列

    data.table 包中的melt() 函数能够同时重塑多个值列。第 1、3、5、... 列包含日期字符串,而第 2、4、6、... 列包含数值。

    library(data.table)
    long <- melt(setDT(input), measure.vars = list(date = seq(1, ncol(raw), by = 2), 
                                                   value = seq(2, ncol(raw), by = 2)))
    long
    
       variable       date value
    1:        1 2007-06-11  1509
    2:        1 2007-06-12  1493
    3:        1 2007-06-13  1324
    4:        2 2007-06-11  1138
    5:        2 2007-06-13  1200
    6:        2 2007-06-14  1122
    7:        3 2008-01-17   990
    8:        3 2008-01-18   800
    9:        3 2008-01-19   880
    

    现在,重新调整为宽幅面。 rowid() 函数用于创建值的压缩视图:

    dcast(long, date  ~ rowid(date, prefix = "V"))
    
             date   V1   V2
    1: 2007-06-11 1509 1138
    2: 2007-06-12 1493   NA
    3: 2007-06-13 1324 1200
    4: 2007-06-14 1122   NA
    5: 2008-01-17  990   NA
    6: 2008-01-18  800   NA
    7: 2008-01-19  880   NA
    

    或者,这些值可以显示为“稀疏矩阵”,原始列组编号作为列标题。

    dcast(long, date  ~ variable)
    
             date    1    2   3
    1: 2007-06-11 1509 1138  NA
    2: 2007-06-12 1493   NA  NA
    3: 2007-06-13 1324 1200  NA
    4: 2007-06-14   NA 1122  NA
    5: 2008-01-17   NA   NA 990
    6: 2008-01-18   NA   NA 800
    7: 2008-01-19   NA   NA 880
    

    数据

    library(data.table)
    input <- fread(
      "2007-06-11 1509 2007-06-11 1138 2008-01-17 990
       2007-06-12 1493 2007-06-13 1200 2008-01-18 800
       2007-06-13 1324 2007-06-14 1122 2008-01-19 880"
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-04
      • 1970-01-01
      • 1970-01-01
      • 2014-02-05
      • 2014-11-28
      • 1970-01-01
      • 2021-07-27
      相关资源
      最近更新 更多