Допустим, у вас есть две таблицы данных временных рядов различной длины:
dt1 = data.table(
Date = seq(as.Date('2000-01-01'), as.Date('2000-01-10'), by = 1),
Return1 = rnorm(10)
)
dt2 = data.table(
Date = seq(as.Date('2000-01-05'), as.Date('2000-01-10'), by = 1),
Return2 = rnorm(6)
)
Вы можете выполнить merge () для двух таблиц data.table и предоставить переменную, с которой вы хотите объединить их. В данном случае «Дата». Кроме того, мы передаем аргумент All = T, чтобы сохранить строки, которые не находятся в объединении записей Date для dt1 и dt2.
dtmain = merge(dt1, dt2, on = 'Date', all = T)
> dtmain
Date Return1 Return2
1: 2000-01-01 -2.9934945 NA
2: 2000-01-02 -0.6712139 NA
3: 2000-01-03 0.2146184 NA
4: 2000-01-04 1.2342134 NA
5: 2000-01-05 0.3276646 -2.35205416
6: 2000-01-06 1.1823349 0.39382064
7: 2000-01-07 -0.8771251 0.72213968
8: 2000-01-08 -0.8145120 -0.15433887
9: 2000-01-09 1.0455526 0.05794934
10: 2000-01-10 -1.2378961 -0.49929648
Теперь рассмотрим, есть ли у вас три или более данных временных рядов. объекты таблицы:
dt3 = data.table(
Date = seq(as.Date('2000-01-02'), as.Date('2000-01-8'), by = 1),
Return3 = rnorm(7)
)
Если вы хотите объединить их все, вы можете использовать следующее решение, используя Reduce ():
dtlist = list(dt1, dt2, dt3) # Put your TS objects in a list
by = 'Date' # Declare the variable you want to merge the tables on
dtmain = Reduce(function(...) merge(..., all = TRUE, by = by), dtlist)
> dtmain
Date Return1 Return2 Return3
1: 2000-01-01 0.45667875 NA NA
2: 2000-01-02 -0.84284705 NA 0.7747270
3: 2000-01-03 0.58849764 NA -0.4224948
4: 2000-01-04 -0.76110475 NA -0.7372464
5: 2000-01-05 0.72950287 -0.6800249 -0.6412878
6: 2000-01-06 1.65512675 -0.9477490 0.4073604
7: 2000-01-07 -0.56407002 0.9283520 0.3264292
8: 2000-01-08 0.05535025 1.7146754 0.7125701
9: 2000-01-09 0.06031502 1.2413374 NA
10: 2000-01-10 -0.23840704 0.3846532 NA