我想将一个新序列列绑定到一个现有的时间序列。下面是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的工作方式一样?)。
转换为xts
和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
实际上,当您尝试在行或列的末尾添加一个向量时,R需要花费一些时间来完成这项工作。最有效的方法是创建一个M*N的空矩阵,然后尝试像这样填充它
dat <- matrix(NA,ncol = 10,nrow = 10000)
## for i'th row
dat[i,] = myVector
或第i列data [,i] = myVector
在这种特殊情况下,我认为坚持使用(第一)列为TIME保留的data.frame是有意义的,因为为了简单的描述和回归,我真的不需要时间序列对象的任何特征。这确实意味着要跟踪行(即当我diff()等),但这是明智的。谢谢你的建议!