Enlace binario condicional y actualización por referencia utilizando el paquete data.table

Así que aquí está el problema de mi vida real que siento que se puede resolver fácilmente y me falta algo obvio aquí. Tengo dos grandes conjuntos de datos llamados TK y 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 

Deseo realizar una combinación binaria izquierda para TK en la columna venue_id %in% 1:2 cuando venue_id %in% 1:2 , mientras actualiza New_id por referencia . En otras palabras, el resultado deseado sería

 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 

Estaba pensando en combinar ambas condiciones, pero no funcionó (todavía no estoy seguro de por qué)

 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. 

Mi siguiente idea fue utilizar un encadenamiento que logra parcialmente el objective uniéndolo correctamente pero en una tabla temporal sin afectar realmente a los 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 

Entonces, para dejar en claro, soy consciente de que puedo dividir TK en dos tablas, realizar la unión y luego volver a rbind , pero estoy haciendo muchas combinaciones condicionales como esta y también estoy buscando velocidad y memoria eficiente soluciones.

Esto también significa que no estoy buscando una solución dplyr ya que estoy tratando de usar tanto la combinación binaria como la actualización mediante funciones de referencia que solo existen en el paquete data.table IIRC.


Para obtener información adicional, vea estas viñetas:

  • Actualización por referencia
  • Uniones binarias

Copiando de la respuesta actualizada de Arun aquí

 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 

Su respuesta da los detalles de lo que está sucediendo.

Aquí hay un enfoque muy simple:

 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 

No lo he comprobado, pero sospecho que la otra respuesta es más rápida.