Как лучше всего соединить один столбец таблицы данных с другим столбцом той же таблицы данных?

Мои данные

У меня есть data.table DTс текущим (F0YR) и следующим (F1YR) конец финансового года (FYE), закодированный как целое число. Поскольку каждый следующий FYE в конечном итоге станет текущий FYE, целое число будет в обоих столбцах F1YRи F0YR. Кроме того, мои данные содержат ежемесячные наблюдения, поэтому в наборе данных будет один и тот же FYE. несколько раз:

library(data.table)
DT <- data.table(ID     = rep(c("A", "B"), each=9),
                 MONTH  = rep(100L:108L, times=2),
                 F0YR   = rep(c(1L, 4L, 7L), each=3, times=2),
                 F1YR   = rep(c(4L, 7L, 9L), each=3, times=2),
                 value  = c(rep(1:5, each=3), 6, 6, 7),
                 key    = "ID,F0YR")
DT
      ID MONTH F0YR F1YR value
 [1,]  A   100    1    4     1
 [2,]  A   101    1    4     1
 [3,]  A   102    1    4     1
 [4,]  A   103    4    7     2
 [5,]  A   104    4    7     2
 [6,]  A   105    4    7     2
 [7,]  A   106    7    9     3
 [8,]  A   107    7    9     3
 [9,]  A   108    7    9     3
[10,]  B   100    1    4     4
[11,]  B   101    1    4     4
...

Что я хочу сделать

Для каждой комбинации IDи F1YRя хочу получить значение для IDи F0YRкомбинация. В качестве примера: Компания А имела значение 2для FOYR==4. Сейчас, Мне нужен дополнительный столбец для всех комбинаций с ID=="A"и F1YR==4, для которого установлено значение 2, рядом с уже существующим значением 1.

Что я пробовал

intDT <- DT[CJ(unique(ID), unique(F0YR)), list(ID, F0YR, valueNew = value), mult="last"]
setkey(intDT, ID, F0YR)
setkey(DT, ID, F1YR)
DT <- intDT[DT]
setnames(DT, c("F0YR.1", "F0YR"), c("F0YR", "F1YR"))
DT
      ID F1YR valueNew MONTH F0YR value
 [1,]  A    4        2   100    1     1
 [2,]  A    4        2   101    1     1
 [3,]  A    4        2   102    1     1
 [4,]  A    7        3   103    4     2
 [5,]  A    7        3   104    4     2
 [6,]  A    7        3   105    4     2
 [7,]  A    9       NA   106    7     3
 [8,]  A    9       NA   107    7     3
 [9,]  A    9       NA   108    7     3
[10,]  B    4        5   100    1     4
[11,]  B    4        5   101    1     4
...

(Обратите внимание, что я использую здесь mult="last", потому что, хотя значения должны меняться только при изменении F0YR или F1YR, иногда они не меняются, и это только мое тай-брейк).

Чего я хочу

Это выглядит неустранимым. Прежде всего, я должен сделать копию моего DT. Во-вторых, поскольку я присоединяюсь в основном к одному и тому же data.table, все имена столбцов имеют одно и то же имя. и я должен переименовать их. Я думал, что самосоединениебудет способом продвижения вперед, но я пытался и пытался, и не смог найти хорошего решения. у меня есть надежда что есть что-то простое, чего я просто не вижу... Кто-нибудь знает? Или мои данные настроены таким образом, что это на самом деле сложно (может быть, потому что у меня есть ежемесячные наблюдения, но я хочу присоединиться только к ежеквартальным или ежегодным меняющимся значениям).

10
задан Christoph_J 14 June 2012 в 09:51
поделиться