r join data.table

Unión binaria condicional y actualización por referencia utilizando el paquete data.table



join (2)

Así que aquí está mi problema de la 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

Quiero realizar una unión izquierda binaria a TK en la columna venue_id %in% 1:2 , mientras actualizo 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 usar el encadenamiento que logra parcialmente el objetivo uniéndome correctamente pero en alguna tabla temporal sin afectar realmente 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

Para dejar en claro, soy muy consciente de que puedo dividir TK en dos tablas, realizar la unión y luego volver a rbind , pero estoy haciendo muchas uniones condicionales diferentes como esta y también estoy buscando velocidad y memoria eficientes soluciones

Esto también significa que no estoy buscando una solución dplyr , ya que estoy tratando de usar tanto la unión binaria como la actualización por características de referencia que solo existen en el paquete data.table IIRC.

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


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.


Copiando la respuesta actualizada de Arun here

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.