Объединение таблиц с одинаковыми именами столбцов в R data.table

Как вы работаете с идентично названными, не ключевыми столбцами при подключении data.tables? Я ищу решение для table.field нотации в SQL.

Например, давайте скажем, что у меня есть таблица DT, которая заполняется новыми данными для столбца v каждый период времени. У меня также есть таблица DT_HIST, которая хранит записи из предыдущих периодов времени (t). Я хочу найти разницу между текущим и предыдущим периодом времени для каждого x

В этом случае: DT - период времени 3, а DT_HIST имеет периоды времени 1 и 2:

 DT <- data.table(x=c(1,2,3,4),v=c(20,20,35,30))
 setkey(DT,x)
 DT_HIST <- data.table(x=rep(seq(1,4,1),2),v=c(40,40,40,40,30,25,45,40),t=c(rep(1,4),rep(2,4)))
 setkey(DT_HIST,x)

> DT
   x  v
1: 1 20
2: 2 20
3: 3 35
4: 4 30

> DT_HIST
   x  v t
1: 1 40 1
2: 1 30 2
3: 2 40 1
4: 2 25 2
5: 3 40 1
6: 3 45 2
7: 4 40 1
8: 4 40 2

Я хотел бы присоединиться к DT с DT_HIST[t==1,] на x и рассчитать разницу в v.

Простое соединение таблиц приводит к столбцам v и v.1.

> DT[DT_HIST[t==2],]
   x  v v.1 t
1: 1 20  30 2
2: 2 20  25 2
3: 3 35  45 2
4: 4 30  40 2

Тем не менее, я не могу найти способ ссылаться на разные столбцы v при выполнении соединения.

> DT[DT_HIST[t==2],list(delta=v-v.1)]
Error in `[.data.table`(DT, DT_HIST[t == 2], list(delta = v - v.1)) : 
object 'v.1' not found

> DT[DT_HIST[t==2],list(delta=v-v)]
   x delta
1: 1     0
2: 2     0
3: 3     0
4: 4     0

Если это дубликат, прошу прощения. Я искал и не мог найти аналогичный вопрос.

Кроме того, я понимаю, что я могу просто переименовать столбцы после присоединения, а затем запустить мое желаемое выражение, но я хочу знать, делаю ли я это совершенно неправильно.

Ответ 1

Вы можете использовать i.colname для доступа к столбцу в i -expression data.table. Я вижу, вы используете старую версию data.table. С тех пор произошли несколько изменений: дублированные имена объединенных столбцов имеют префикс i. вместо постфикса номера (что делает его более согласованным с доступом i. к объединенным именам столбцов, и нет без-by-by больше по умолчанию.

В последней версии (1.9.3) это вы получите:

DT[DT_HIST[t==2],list(delta = v - i.v)]
#   delta
#1:   -10
#2:    -5
#3:   -10
#4:   -10