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.