прокатка объединяет data.table в 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's rows using Y (or Y's key if it has one) 
as an index.

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


person Alex    schedule 19.08.2012    source источник
comment
Я написал сообщение в блоге, описывающее, как работают скользящие соединения здесь gormanalysis.com/r- соединения таблицы данных   -  person Ben    schedule 30.07.2014


Ответы (1)


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

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

rolltolast Like roll but the data is not rolled forward past the last observation within each group defined by the join columns. The value of i must fall in a gap in x but not after the end of the data, for that group defined by all but the last join column. roll and rolltolast may not both be TRUE.

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

person Matt Dowle    schedule 20.08.2012
comment
Я не видел этого, спасибо за публикацию. что меня смущает, так это то, что x [y] возвращает строки, которые находятся в y, но не в x? это не похоже на эквисоединение ... в частности, x [y] и merge (x, y, all.y = TRUE) кажутся одинаковыми, нет? - person Alex; 20.08.2012
comment
О, я понимаю, что ты имеешь в виду. nomatch по умолчанию NA, так что по умолчанию это внешнее соединение. Установите «nomatch» на 0 для внутреннего соединения. Термин равное соединение предназначен для обозначения того, что = встречается в (аналогичном) предложении where, в отличие от roll, которое аналогично <=. Equi join не аналогичен innner join. - person Matt Dowle; 20.08.2012
comment
Кроме того, чтобы запутать вас еще больше, ищите ?data.table для без by. Поскольку mult по умолчанию "all", то, что на самом деле происходит в X[Y], - это группировка, и она помещает столбцы соединения из Y в результат (вот почему вы думаете, что он возвращает строки из Y). Как только вы это поймете, переходите к join inherited scope. - person Matt Dowle; 20.08.2012
comment
Вы видели и следовали совету вверху ?data.table, чтобы запустить example(data.table) и проработать примеры в командной строке? - person Matt Dowle; 20.08.2012
comment
У меня есть, да, но, к сожалению, я все еще был сбит с толку. Я начал придумывать свои собственные примеры, чтобы попытаться понять логику, но, похоже, происходили противоречивые вещи, поэтому я не мог понять, что происходит. это делает его немного яснее, хотя у меня может возникнуть больше вопросов в будущем. - person Alex; 20.08.2012
comment
rolltolast заменяется на rollends в v1.9.6. : «rolltolast» помечен как «устаревший» в? data.table с версии 1.8.8 от CRAN 3 марта 2013 г., см. НОВОСТИ. Вместо этого перейдите на более гибкие «ролленды». "rolltolast" будет удален в следующей версии. - person swihart; 11.07.2015
comment
@swihart +1 спасибо. Любой шанс, что вы сможете отредактировать ответ напрямую, будет быстрее. - person Matt Dowle; 14.07.2015