Условное двоичное соединение и обновление по ссылке с использованием пакета data.table

Итак, вот моя проблема в реальной жизни, которую я чувствую, может быть легко решена, и я пропущу что-то очевидное здесь. У меня есть два больших набора данных, называемые TK и DFT

 library(data.table) set.seed(123) (TK <- data.table(venue_id = rep(1:3, each = 2), DFT_id = rep(1:3, 2), New_id = sample(1e4, 6), key = "DFT_id")) # venue_id DFT_id New_id # 1: 1 1 2876 # 2: 1 2 7883 # 3: 2 3 4089 # 4: 2 1 8828 # 5: 3 2 9401 # 6: 3 3 456 (DFT <- data.table(venue_id = rep(1:2, each = 2), DFT_id = 1:4, New_id = sample(4), key = "DFT_id")) # venue_id DFT_id New_id # 1: 1 1 3 # 2: 1 2 4 # 3: 2 3 2 # 4: 2 4 1 

Я хочу выполнить двоичное левое соединение с TK в столбце venue_id %in% 1:2 когда venue_id %in% 1:2 , при обновлении New_id по ссылке . Другими словами, желаемый результат был бы

 TK # venue_id DFT_id New_id # 1: 1 1 3 # 2: 2 1 3 # 3: 1 2 4 # 4: 3 2 9401 # 5: 2 3 2 # 6: 3 3 456 

Я думал объединить оба условия, но это не сработало (все еще не знаю, почему)

 TK[venue_id %in% 1:2 & DFT, New_id := i.New_id][] # Error in `[.data.table`(TK, DFT & venue_id %in% 1:2, `:=`(New_id, i.New_id)) : # i is invalid type (matrix). Perhaps in future a 2 column matrix could return a list of elements of DT (in the spirit of A[B] in FAQ 2.14). # Please let datatable-help know if you'd like this, or add your comments to FR #1611. 

Моя следующая идея заключалась в том, чтобы использовать цепочку, которая частично достигает цели, правильно соединяясь, но на некоторой временной таблице, фактически не влияя на TK

 TK[venue_id %in% 1:2][DFT, New_id := i.New_id][] TK # venue_id DFT_id New_id # 1: 1 1 2876 # 2: 2 1 8828 # 3: 1 2 7883 # 4: 3 2 9401 # 5: 2 3 4089 # 6: 3 3 456 

Поэтому, чтобы ясно, я хорошо знаю, что я могу разделить TK на две таблицы, выполнить объединение, а затем снова rbind , но я делаю много разных условных объединений, подобных этому, и я также ищу эффективную скорость и память решения.

Это также означает, что я не ищу решение dplyr поскольку я пытаюсь использовать как двоичное соединение, так и обновление по ссылочным функциям, которые существуют только в пакете data.table IIRC.


Для получения дополнительной информации см. Эти виньетки:

  • Обновление по ссылке
  • Двоичные объединения

Копирование из обновленного ответа Аруна здесь

 TK[venue_id %in% 1:2, New_id := DFT[.SD, New_id]][] # venue_id DFT_id New_id # 1: 1 1 3 # 2: 2 1 3 # 3: 1 2 4 # 4: 3 2 9401 # 5: 2 3 2 # 6: 3 3 456 

Его ответ дает подробную информацию о том, что происходит.

Вот очень простой подход:

 TK[DFT, New_id := ifelse(venue_id %in% 1:2, i.New_id, New_id)][] # venue_id DFT_id New_id # 1: 1 1 3 # 2: 2 1 3 # 3: 1 2 4 # 4: 3 2 9401 # 5: 2 3 2 # 6: 3 3 456 

Я не проверял, но я подозреваю, что другой ответ быстрее.

  • Добавление объектов в пространство имен пакетов
  • Как отсортировать данные по дате
  • вычислить среднее значение для каждого столбца матрицы в R
  • Упорядоченный график столбцов в ggplot
  • Построить несколько строк на одном графике
  • Доступ к URL-адресу и чтение данных с помощью R
  • Удалить часть строки
  • Как анализировать миллисекунды?
  • Как извлечь один столбец из data.frame в качестве data.frame?
  • Выбор подмножества столбцов в таблице данных.
  • Перекрывающиеся совпадения в R
  • Давайте будем гением компьютера.