Jak najlepiej połączyć jedną kolumnę tabeli danych z inną kolumną tej samej tabeli danych?
Mam tabelę danychDT
z prądem (F0YR
) i następne (F1YR
) koniec roku obrachunkowego (FYE) zakodowany jako liczby całkowite. Ponieważ każdy następny FYE stanie się w końcu bieżącym FYE, liczba całkowita będzie obie w kolumnieF1YR
iF0YR
. Moje dane zawierają również obserwacje miesięczne, więc ten sam FYE będzie w zestawie danych wielokrotnie:
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
...
Co chcę robićDla każdegoID
iF1YR
kombinacja, chcę uzyskać wartość dlaID
iF0YR
połączenie. Jako przykład: Firma A miała wartość2
dlaFOYR==4
. Teraz chcę dodatkową kolumnę dla wszystkich kombinacji zID=="A"
iF1YR==4
który jest ustawiony na 2, obok już istniejącej wartości 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
...
(Zauważ, że używammult="last"
tutaj, ponieważ chociaż wartości powinny się zmieniać tylko w przypadku zmian F0YR lub F1YR, czasami nie, a to jest tylko mój wyłącznik krawatowy.
To wygląda na improwizowane. Przede wszystkim muszę zrobić kopię mojego DT. Po drugie, ponieważ przyłączam się zasadniczo do tego samegodata.table
, wszystkie nazwy kolumn mają tę samą nazwę i muszę je zmienić. Myślałem, że aself join
byłby to krok naprzód, ale próbowałem i próbowałem i nie mogłem znaleźć dobrego rozwiązania. Mam nadzieję, że jest tam coś łatwego, czego po prostu nie widzę ... Czy ktoś ma jakąś wskazówkę? Albo czy moje dane są skonfigurowane w taki sposób, że są naprawdę trudne (może dlatego, że mam miesięczne obserwacje, ale chcę dołączyć tylko zmieniające się kwartalnie lub roczne wartości).