#r #time-series
Вопрос:
Я хочу привязать новую серию к существующему временному ряду по столбцам. Вот пример из справки(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?).
Комментарии:
1. К сожалению, нет четкого способа обработки имен с временными рядами класса ts. Лично мне не нравится использовать другие классы, потому что я с подозрением отношусь к разделению временных рядов на множество разных стандартов (кроме того, для обычных полных временных рядов я думаю, что ключ/индекс даты и времени является излишним). Но я предполагаю, что оригинальные методы для временных рядов иногда могут быть разочаровывающими. PS : в вашем примере вы забыли частоту = частота(z)
Ответ №1:
Преобразовать в 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
Ответ №2:
На самом деле, когда вы пытаетесь добавить вектор в конце строк или столбцов, для выполнения этой работы R требуется время. самый эффективный способ-создать пустую матрицу M*N, а затем попытаться заполнить ее следующим образом
dat <- matrix(NA,ncol = 10,nrow = 10000)
## for i'th row
dat[i,] = myVector
или для i-го столбца
dat[,i] = мой вектор
Ответ №3:
В данном конкретном случае я думаю, что имеет смысл придерживаться data.frame с (первым) столбцом, зарезервированным для ВРЕМЕНИ, потому что для простого описания и регрессии мне действительно не нужны какие-либо функции объекта временного ряда. Это означает отслеживание строк (т. Е. Когда я различаю () и т. Д.), Но в любом случае это разумно. Спасибо за ваши предложения!