Как лучше всего объединить один столбец data.table с другим столбцом того же data.table?
У меня есть data.tableDT
с текущей (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
...
What I want to do
Для каждого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
все имена столбцов имеют одинаковое имя
и я должен переименовать их. Я думал, чтоself join
был бы путь вперед, но я пытался и не мог найти хорошее решение. У меня есть надежда
что есть что-то простое, чего я просто не вижу ... У кого-нибудь есть подсказка? Или мои данные настроены таким образом, что это на самом деле трудно
(возможно, потому что у меня есть ежемесячные наблюдения, но я хочу присоединиться только к ежеквартальным или ежегодным изменениям значений).