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
ies unadata.table,xdebe tener una clave.ise une axutilizando la clave y se devuelven las filas enxque coinciden. Se realiza una unión equitativa entre cada columna enipara cada columna en la clave dex. La coincidencia es una búsqueda binaria en C compilada en tiempo O (log n). Siitiene menos columnas que la clave dex, entonces muchas filas dexpueden coincidir con cada fila dei. Siitiene más columnas que la clave dex, las columnas deino 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 dexy 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