在R中对齐多个时间序列

时间:2017-06-20 05:55:37

标签: r date time-series

我在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
...

谢谢!

2 个答案:

答案 0 :(得分:0)

将数据分成几部分,然后merge使用all.x = TRUE选项加入各个部分(您可以优雅地使用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

答案 1 :(得分:0)

OP要求重塑输入数据的日期/值对,以便列出每个日期的值。

这两个步骤是必需的:

  1. 从宽格式到长格式同时重塑多个值列
  2. 重塑为宽格式,但带有一个日期列

melt()包中的data.table函数能够同时重塑多个值列。第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"
)