r - Left join Table usando Data.Table
merge (2)
Supongamos que tengo dos tablas:
UN
A B
1: 1 12
2: 2 13
3: 3 14
4: 4 15
segundo
A B
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 B.x B.y
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, bb:=i.b, on=''a'']
lo que da:
> A
a b 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, bb:=ib, on=''a'']
es mejor que A <- B[A, on=''a'']
es la eficiencia de la memoria. Con A[B, bb:=ib, on=''a'']
la ubicación de A
en la memoria se mantiene igual:
> address(A)
[1] "0x102afa5d0"
> A[B, bb:=i.b, on=''a'']
> 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"
Aunque esto realmente no hace una defference en pequeños conjuntos de datos como estos, hace la diferencia en los grandes conjuntos de datos 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)