Ответ 1
Я бы сделал это вот так:
setkey(d1, v1, V3)
d1[d2, v4 := v4][]
-
Для соединения формы
x[i]
необходимо установить ключ дляx
.i
может иметь или не иметь набор ключей. Поэтому мы устанавливаем дляd1
ключ для столбцовv1
иV3
. -
Далее мы выполняем объединение
d1[d2]
, которое для каждой строкиd2
находит строки, которые соответствуют столбцам ключаd1
, и возвращает результат объединения. Мы точно не ищем этот результат. Мы хотели бы добавить новый столбец, где каждая соответствующая строка получает значение отd2
v4
и в противном случаеNA
. Для этого мы используем подзадачу data.table по ссылочным функциям. При подключенииi
tox
мы все равно можем предоставить выражение вj
и ссылаться на столбцыi
. Вы также можете ссылаться на них какi.v4
(обычно используется, если есть столбцы с одинаковыми именами как вx
, так иi
). -
:=
добавляет/обновляет столбец по ссылке. LHS:=
- это имя столбца, которое мы хотим создать здесь, а RHSv4
- это значение, которое мы хотим присвоить (здесь, это столбец отd2
). Поэтому для каждой соответствующей строки мы назначаемd2
v4
наd1
новый столбец (который мы называем)v4
по ссылке (на месте, что означает, что копия не создается), и те строки без совпадений получат значение по умолчаниюNA
. -
Последний
[]
предназначен для печати вывода на экран, поскольку:=
возвращает результат невидимо.
Надеюсь, это поможет понять, что происходит здесь.