Traducción de uniones SQL en claves externas a sintaxis de datos R
data.table (1)
El paquete data.table
proporciona muchos de los mismos métodos de manejo de tablas que SQL. Si una tabla tiene una clave, esa clave consiste en una o más columnas. Pero una tabla no puede tener más de una clave, porque no se puede clasificar de dos maneras diferentes al mismo tiempo.
En este ejemplo, X
e Y
son data.table
con una columna de clave única "id"; Y
también tiene una columna no clave "x_id".
X <- data.table(id = 1:5, a=4:8,key="id")
Y <- data.table(id = c(1,1, 3,5,7), x_id=c(1,4:1), key="id")
La siguiente sintaxis uniría las tablas en sus claves:
X[Y]
¿Cómo puedo traducir la siguiente sintaxis SQL al código data.table?
select * from X join Y on X.id = Y.x_id;
Lo más cerca que he conseguido es:
Y[X,list(id, x_id),by = x_id,nomatch=0]
Sin embargo, esto no hace la misma unión interna que la instrucción SQL.
Aquí hay un ejemplo más claro en el que la clave externa es y_id, y queremos que la unión busque los valores de Y2, donde X2$y_id = Y2$id
.
X2 <- data.table(id = 1:5, y_id = c(1,1,2,2,2), key="id")
Y2 <- data.table(id = 1:5, b = letters[1:5], key="id")
Me gustaría producir la tabla:
id y_id b
1 1 "a"
2 1 "a"
3 2 "b"
4 2 "b"
5 2 "b"
similar a lo que hace el siguiente kludge:
> merge(data.frame(X2), data.frame(Y2), by.x = "y_id", by.y = "id")
y_id id b
1 1 1 a
2 1 2 a
3 2 3 b
4 2 4 b
5 2 5 b
Sin embargo, cuando hago esto:
X2[Y2, 1:2,by = y_id]
No obtengo el resultado deseado:
y_id V1
[1,] 1 1
[2,] 1 2
[3,] 2 1
[4,] 2 2
Buena pregunta. Tenga en cuenta lo siguiente (es decir, enterrado) en la ?data.table
:
Cuando
i
es unadata.table
,x
debe tener una clave.i
se une ax
utilizando la clave y se devuelven las filas enx
que coinciden. Se realiza una unión equitativa entre cada columna eni
para cada columna en la clave dex
. La coincidencia es una búsqueda binaria en C compilada en tiempo O (log n). Sii
tiene menos columnas que la clave dex
, entonces muchas filas dex
pueden coincidir con cada fila dei
. Sii
tiene más columnas que la clave dex
, las columnas dei
no participan en la unión se incluyen en el resultado. Si también tengo una clave , son las columnas clave que se utilizan para coincidir con las columnas clave dex
y se realiza una combinación binaria de las dos tablas.
Entonces, la clave aquí es que no tengo que ser ingresado. Sólo x
debe estar en clave.
X2 <- data.table(id = 11:15, y_id = c(14,14,11,12,12), key="id")
id y_id
[1,] 11 14
[2,] 12 14
[3,] 13 11
[4,] 14 12
[5,] 15 12
Y2 <- data.table(id = 11:15, b = letters[1:5], key="id")
id b
[1,] 11 a
[2,] 12 b
[3,] 13 c
[4,] 14 d
[5,] 15 e
Y2[J(X2$y_id)] # binary search for each item of (unsorted and unkeyed) i
id b
[1,] 14 d
[2,] 14 d
[3,] 11 a
[4,] 12 b
[5,] 12 b
o,
Y2[SJ(X2$y_id)] # binary merge of keyed i, see ?SJ
id b
[1,] 11 a
[2,] 12 b
[3,] 12 b
[4,] 14 d
[5,] 14 d
identical(Y2[J(X2$y_id)], Y2[X2$y_id])
[1] FALSE