Свертывание объединяет данные. таблица в R

Я пытаюсь понять немного больше о том, как работает сводная работа, и я испытываю некоторую путаницу, я надеялся, что кто-нибудь сможет это разъяснить. Чтобы взять конкретный пример:

dt1 <- data.table(id=rep(1:5, 10), t=1:50, val1=1:50, key="id,t")
dt2 <- data.table(id=rep(1:5, 2), t=1:10, val2=1:10, key="id,t")

Я ожидал, что это приведет к длинному data.table, в котором свертываются значения в dt2:

dt1[dt2,roll=TRUE]

Вместо этого правильный способ сделать это выглядит следующим образом:

dt2[dt1,roll=TRUE]

Может ли кто-нибудь объяснить мне больше о том, как работает соединение data.table, поскольку я явно не понимаю его правильно. Я думал, что dt1[dt2,roll=TRUE] соответствует sql-эквиваленту select * from dt1 right join dt2 on (dt1.id = dt2.id and dt1.t = dt2.t), кроме как с добавленной функциональностью locf.

Кроме того, в документации говорится:

X[Y] is a join, looking up X rows using Y (or Y key if it has one) 
as an index.

Это означает, что нужно возвращать только вещи в X, а соединение - внутреннее соединение, а не внешнее. Как насчет в случае, когда roll=T, но тот конкретный id не существует в dt1? Играя немного больше, я не могу понять, какое значение помещается в столбце.

Ответ 1

Цитата из документации, как видно, из FAQ 1.12. В чем разница между X [Y] и слиянием (X, Y). Вы нашли следующее в ?data.table и это помогает?

roll Применяется к последнему столбцу объединения, обычно к дате, но может быть любым упорядоченная переменная, нерегулярная и включая пробелы. Если roll = TRUE и я строка соответствует всем, кроме последнего столбца соединения x, и его значение в последний столбец присоединяется к пробелу (в том числе после последнего наблюдение в x для этой группы), то преобладающее значение в x равно свернул вперед. Эта операция особенно быстро используется с измененным двоичный поиск. Операция также известна как последнее наблюдение вперед (LOCF). Как правило, не должно быть дубликатов в ключе x, последний ключевой столбец - дата (или время, или дата-время) и все столбцы к ключу x присоединены к. Общей идиомой является выбор одновременные регулярные временные ряды (dts) по набору идентификаторов (ids): DT [CJ (ids, dts), roll = TRUE], где DT имеет ключ с двумя столбцами (id, date) и CJ означает перекрестное соединение.

rolltolast Как и roll, но данные не перекатываются вперед наблюдения в каждой группе, определяемой столбцами объединения. Значение of я должен упасть в промежутке в x, но не после окончания данных, для эта группа определена всем, кроме последнего столбца объединения. рулон и rolltolast не может быть ИСТИНЫ.

В терминах левых/правых аналогов SQL-соединений я предпочитаю думать об этом в контексте часто задаваемых вопросов 2.14 Можете ли вы объяснить, почему data.table вдохновляется синтаксисом A [B] в базе. Это довольно длинный ответ, поэтому я не буду вставлять его здесь.