首页 > 解决方案 > 将序列添加到现有时间序列的最有效方法是什么?

问题描述

我想将新系列列绑定到现有时间系列。以下是 help(ts) 中的示例:

z <- ts(
  matrix(rnorm(300), 100, 3), 
  start = c(1961, 1), 
  frequency = 12
)

这是我发现在保留名称和时间的同时添加到系列中的唯一方法:

z1 <- ts(
  cbind(
    z,
    runif(dim(z)[1])
  ),
  start(z),
  names = c(dimnames(z)[[2]], 'unif')
)

我怀疑有一种更清洁的方法可以做到这一点(就像 data.frames 的工作方式一样?)。

标签: rtime-series

解决方案


转换为xtsand transform(用于R 4.1.0运算符|>

library(xts)
z1 <- as.xts(z) |> 
          transform(unif = runif(dim(z)[1]))

-输出

> head(z1)
            Series.1   Series.2   Series.3      unif
Jan 1961  0.58124800  0.1510926  1.0826555 0.2552968
Feb 1961  1.15737740  0.8661810  0.3916422 0.5525945
Mar 1961 -0.23185935  0.2858634  0.8118146 0.3055733
Apr 1961 -1.72068316 -0.6347280  0.1287224 0.4017409
May 1961 -2.07815044 -0.5623785 -1.8947997 0.3404939
Jun 1961 -0.09922355 -0.6606838  1.2231682 0.5405788

另一种选择是as_tsibble

library(tsibble)
library(dplyr)
library(tidyr)
as_tsibble(z) %>% 
    pivot_wider(names_from = key, values_from = value) %>% 
    mutate(unif = runif(n()))
# A tsibble: 100 x 5 [1M]
      index `Series 1` `Series 2` `Series 3`  unif
      <mth>      <dbl>      <dbl>      <dbl> <dbl>
 1 1961 Jan     0.581      0.151     1.08    0.632
 2 1961 Feb     1.16       0.866     0.392   0.698
 3 1961 Mar    -0.232      0.286     0.812   0.631
 4 1961 Apr    -1.72      -0.635     0.129   0.912
 5 1961 May    -2.08      -0.562    -1.89    0.750
 6 1961 Jun    -0.0992    -0.661     1.22    0.370
 7 1961 Jul     0.450      1.01     -0.0622  0.605
 8 1961 Aug     0.328     -1.28     -0.729   0.221
 9 1961 Sep     0.511     -0.675    -0.387   0.489
10 1961 Oct    -0.943      0.0116    0.00400 0.630
# … with 90 more rows

推荐阅读