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

117
7

Мои данные


У меня есть 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. В качестве примера: компания A имела значение 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 будет способом продвижения вперед, но я попытался и попытался и не смог получить хорошее решение. У меня есть надежда
что есть что-то легкое, что я просто не вижу... Кто-нибудь знает? Или мои данные настроены таким образом, что на самом деле это сложно
(возможно, потому, что у меня есть ежемесячные наблюдения, но вы хотите присоединиться только к квартальным или годовым изменениям).

спросил(а) 2012-06-14T12:51:00+04:00 7 лет, 11 месяцев назад
1
Решение
100

В подобных случаях мантра "сначала объединяется, а затем присоединяется к ней". Итак, начиная с вашего DT и используя v1.8.1:


> agg = DT[,last(value),by=list(ID,F0YR)]
> agg
ID F0YR V1
1: A 1 1
2: A 4 2
3: A 7 3
4: B 1 4
5: B 4 5
6: B 7 7

Я назвал его agg, потому что я не мог придумать лучшего имени. В этом случае вы хотели last, который на самом деле не является совокупностью как таковой, но вы знаете, что я имею в виду.

Затем обновите DT по ссылке группой. Здесь мы группируем i.


setkey(DT,ID,F1YR)
DT[agg,newcol:=V1]
ID MONTH F0YR F1YR value newcol
1: A 100 1 4 1 2
2: A 101 1 4 1 2
3: A 102 1 4 1 2
4: A 103 4 7 2 3
5: A 104 4 7 2 3
6: A 105 4 7 2 3
7: A 106 7 9 3 NA
8: A 107 7 9 3 NA
9: A 108 7 9 3 NA
10: B 100 1 4 4 5
11: B 101 1 4 4 5
12: B 102 1 4 4 5
13: B 103 4 7 5 7
14: B 104 4 7 5 7
15: B 105 4 7 5 7
16: B 106 7 9 6 NA
17: B 107 7 9 6 NA
18: B 108 7 9 7 NA

Это правильно? Не уверен, что я полностью следовал. Эти операционные системы должны быть очень быстрыми, без каких-либо копий, и должны масштабироваться до больших данных. По крайней мере, это намерение.

ответил(а) 2012-06-14T19:04:00+04:00 7 лет, 11 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема