Unir a la izquierda usando data.table

Supongamos que tengo dos data.table ‘s:

UN:

AB 1: 1 12 2: 2 13 3: 3 14 4: 4 15 

SEGUNDO:

  AB 1: 2 13 2: 3 14 

y tengo el siguiente código:

 merge_test = merge(dataA, dataB, by="A", all.data=TRUE) 

Yo obtengo:

  A Bx By 1: 2 13 13 2: 3 14 14 

Sin embargo, quiero todas las filas en dataA en la tabla fusionada final. ¿Hay alguna forma de hacer esto?

    Puedes intentar esto:

     A < - data.table(a = 1:4, b = 12:15) B <- data.table(a = 2:3, b = 13:14, key = 'a') B[A] 

    Si desea agregar los valores b de B a A , entonces es mejor unirse a A con B y actualizar A por referencia de la siguiente manera:

     A[B, on = 'a', bb := ib] 

    lo que da:

     > A ab bb 1: 1 12 NA 2: 2 13 13 3: 3 14 14 4: 4 15 NA 

    Esta es una mejor aplicación que usar B[A, on='a'] porque este último simplemente imprime el resultado en la consola. Cuando desee volver a obtener los resultados en A , necesita usar A < - B[A, on='a'] que le dará el mismo resultado.

    La razón por la que A[B, on = 'a', bb := ib] es mejor que A < - B[A, on = 'a'] es la eficiencia de la memoria. Con A[B, on = 'a', bb := ib] la ubicación de A en la memoria permanece igual:

     > address(A) [1] "0x102afa5d0" > A[B, on = 'a', bb := ib] > address(A) [1] "0x102afa5d0" 

    Mientras que, por otro lado, con A < - B[A, on = 'a'] , se crea un nuevo objeto y se guarda en la memoria como A y, por lo tanto, tiene otra ubicación en la memoria:

     > address(A) [1] "0x102abae50" > A < - B[A, on = 'a'] > address(A) [1] "0x102aa7e30" 

    El uso de merge ( merge.data.table ) da como resultado un cambio similar en la ubicación de la memoria:

     > address(A) [1] "0x111897e00" > A < - merge(A, B, by = 'a', all.x = TRUE) > address(A) [1] "0x1118ab000" 

    Para la eficiencia de la memoria, es mejor usar una syntax de 'actualización por referencia a la unión' :

     A[B, on = 'a', bb := ib] 

    Aunque esto no supone una diferencia notoria con conjuntos de datos pequeños como estos, sí hace la diferencia en conjuntos de datos grandes para los que se diseñó data.table .


    Datos usados:

     A < - data.table(a = 1:4, b = 12:15) B <- data.table(a = 2:3, b = 13:14)