Como melhor unir uma coluna de um data.table com outra coluna do mesmo data.table?
Eu tenho um data.tableDT
com a corrente (F0YR
) e o seguinte (F1YR
) final do ano fiscal (FYE) codificado como inteiros. Como cada próximo FYE eventualmente se tornará um FYE atual, o inteiro será ambos na colunaF1YR
eF0YR
. Além disso, meus dados contêm observações mensais para que o mesmo FYE esteja no conjunto de dados várias vezes:
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
...
O que eu quero fazerPara cadaID
eF1YR
combinação, eu quero obter o valor para oID
eF0YR
combinação. Por exemplo: a empresa A tinha um valor de2
paraFOYR==4
. Agora, eu quero uma coluna adicional para todas as combinações comID=="A"
eF1YR==4
que é definido como 2, ao lado do valor já existente de 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
...
(Note que eu usomult="last"
aqui porque, embora os valores só devam mudar com F0YR ou F1YR, algumas vezes eles não mudam e este é apenas o meu desempatador).
Isso parece improvável. Primeiro de tudo, eu tenho que fazer uma cópia do meu DT. Em segundo lugar, desde que eu juntei basicamente o mesmodata.table
, todos os nomes das colunas têm o mesmo nome e eu tenho que renomeá-los. Eu pensei que umself join
seria o caminho a seguir, mas eu tentei e tentei e não consegui uma boa solução. Eu tenho a esperança de que há algo fácil lá fora que eu simplesmente não vejo ... Alguém tem uma pista? Ou os meus dados estão configurados de tal forma que é realmente difícil (talvez porque eu tenha observações mensais, mas queira juntar apenas valores variáveis trimestrais ou anuais).