925 votos

Cómo unirse a las tramas de datos en R (interior, exterior, izquierda, derecha)?

Dadas dos tramas de datos

df1 = data.frame(CustomerId=c(1:6),Product=c(rep("Toaster",3),rep("Radio",3)))
df2 = data.frame(CustomerId=c(2,4,6),State=c(rep("Alabama",2),rep("Ohio",1)))

> df1
  CustomerId Product
           1 Toaster
           2 Toaster
           3 Toaster
           4   Radio
           5   Radio
           6   Radio

> df2
  CustomerId   State
           2 Alabama
           4 Alabama
           6    Ohio

¿Cómo puedo hacer la base de datos de estilo, es decir, sql estilo, se une? Es decir, ¿cómo obtengo:

  • Una combinación interna de df1 y df1
  • Una combinación externa de df1 y df2
  • Una combinación externa izquierda de la df1 y df2
  • Una combinación externa derecha de la df1 y df2

P.S. IKT-JARQ (Sé que Esto - Sólo la Adición de R Preguntas)

Crédito Extra:

¿Cómo puedo hacer un sql estilo instrucción select?

1028voto

Matt Parker Puntos 7373

Mediante la combinación de la función y sus parámetros opcionales:

Inner join: merge(df1, df2) de trabajo para estos ejemplos porque R se incluye automáticamente los marcos comunes los nombres de las variables, pero lo más probable es que desea especificar merge(df1, df2, by="CustomerId") para asegurarse de que eran coincidentes sólo en los campos que desee. También puede utilizar la by.x y by.y parámetros si la coincidencia de las variables tienen nombres diferentes en las distintas tramas de datos.

Combinación externa: merge(x = df1, y = df2, by = "CustomerId", all = TRUE)

Externa izquierda: merge(x = df1, y = df2, by = "CustomerId", all.x=TRUE)

Derecho externo: merge(x = df1, y = df2, by = "CustomerId", all.y=TRUE)

Cross join: merge(x = df1, y = df2, by = NULL)

Al igual que con el inner join, probablemente desee pasar explícitamente "CustomerId" a R como la coincidencia de variable. Creo que es casi siempre mejor explícitamente la identificadores en el que desea combinar; es más seguro si la entrada data.frames cambiar inesperadamente y fácil de leer más tarde.

182voto

medriscoll Puntos 4479

Me gustaría recomendar Gabor Grothendieck del sqldf paquete, que le permite expresar estas operaciones en SQL.

library(sqldf)

## inner join
df3 <- sqldf("SELECT CustomerId, Product, State 
       FROM df1 JOIN df2 USING(CustomerID)")

## left join (substitute 'right' for right join)
df4 <- sqldf("SELECT CustomerId, Product, State 
       FROM df1 LEFT JOIN df2 USING(CustomerID)")

Me parece la sintaxis SQL para ser más simple y más natural que su R equivalente (pero esto sólo puede reflejar mi RDBMS de sesgo).

Ver Gabor del sqldf página de Google Code para obtener más información

166voto

No es la data.table enfoque para un inner join, que es muy de memoria y tiempo de eficiente (y necesario para algunas de las grandes data.frames):

 if(!require(data.table)){install.packages("data.table")}

 df1 = data.frame(CustomerId=c(1:6),Product=c(rep("Toaster",3),rep("Radio",3)))
 df2 = data.frame(CustomerId=c(2,4,6),State=c(rep("Alabama",2),rep("Ohio",1)))

 dt1<-data.table(df1,  key="CustomerId") 
 dt2<-data.table(df2, key="CustomerId")

 joined.dt1.dt.2<-dt1[dt2]

Combinar también funciona en data.tables:

merge(dt1, dt2)

data.table documentado en stackoverflow:
R: ¿cómo hacer un data.table operación de combinación de
La traducción de las combinaciones de SQL claves foráneas a R data.table sintaxis
Alternativas eficientes para combinar para mayor data.frames R
Cómo hacer un básico left outer join con data.table en R?

Otra opción es la combinación() función que se encuentra en la plyr paquete

library(plyr)

join(df1, df2,
     type="inner")

CustomerId Product   State
1          2 Toaster Alabama
2          4   Radio Alabama
3          6   Radio    Ohio

Opciones para el tipo de

  • interior
  • izquierda
  • derecha
  • completa

138voto

Andrew Barr Puntos 491

Puedes hacer las combinaciones así como también el uso de Hadley Wickham es impresionante nuevo dplyr paquete.

Aquí es cómo usted puede hacer la mayoría de las combinaciones en la pregunta original con dplyr

library(dplyr)

#make sure that CustomerId cols are both type numeric
#they ARE not using the provided code in question and dplyr will complain
df1$CustomerId <- as.numeric(df1$CustomerId)
df2$CustomerId <- as.numeric(df2$CustomerId)


#inner
inner_join(df1, df2)

#left outer
left_join(df1, df2)

#right outer (just reverse argument order)
left_join(df2, df1)

71voto

JD Long Puntos 20477

Hay algunos buenos ejemplos de hacerlo en el R Wiki. Voy a robar un par aquí:

Método Merge

Desde sus teclas tienen el mismo nombre, el camino más corto para hacer un inner join es merge():

merge(df1,df2)

un completo inner join (todos los registros de ambas tablas) puede ser creado con el "todo" de la palabra clave:

merge(df1,df2, all=TRUE)

una combinación externa izquierda de la df1 y df2:

merge(df1,df2, all.x=TRUE)

una combinación externa derecha de la df1 y df2:

merge(df1,df2, all.y=TRUE)

usted puede flip 'em, slap 'em y frotar 'em hacia abajo para obtener las otras dos combinaciones externas que le pidieron :)

Subíndice Método

Una combinación externa izquierda con df1 en el lado izquierdo con un subíndice método sería:

df1[,"State"]<-df2[df1[ ,"Product"], "State"]

La otra combinación de combinaciones externas pueden ser creados por mungling la combinación externa izquierda subíndice ejemplo. (sí, sé que es el equivalente de decir "lo voy a dejar como ejercicio para el lector...")

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X