Combinar dataframe en R

Gustavo du Mortier 18 julio 2021
  1. Usar rbind para combinar dataframe en R
  2. Usa el paquete dplyr
  3. Combinar grandes DataFrames en R
Combinar dataframe en R

Cuando manipulamos datos con código R, a menudo nos enfrentamos a la necesidad de combinar dos DataFrames en uno solo. Este tutorial verá algunos métodos para combinar eficientemente dos DataFrames en R.

Supongamos que tienes dos DataFrames, x y y, con algunas columnas que coinciden. Por ejemplo:

x <- data.frame(a=c(218, 415, 339), b=c(25, 19, 43), c=c(950, 872, 645))
y <- data.frame(a=c(309, 115), c=c(799, 814))

Y necesitas combinarlos en un DataFrame resultante, llamado z, por ejemplo. Tales DataFrames podrían ser como estos:

Ejemplo de cuadro de datos R

Usar rbind para combinar dataframe en R

La función rbind combina estructuras de datos, como DataFrames, vectores o matrices, por filas. Su nombre significa row-bind.

Cuando se usa la rbind para combinar dos DataFrames, ambos DataFrames deben tener las mismas columnas. Por lo tanto, en el ejemplo anterior, necesitas añadir la columna b al DataFrame y. Esto puede hacerse ejecutando este comando:

y$b <- NA

Ahora el DataFrame y debería verse así:

Ejemplo de DataFrame R

Ahora puedes usar rbind para combinar los cuadros de datos x y y en el nuevo cuadro de datos z ejecutando este comando:

x <- data.frame(a=c(218, 415, 339), b=c(25, 19, 43), c=c(950, 872, 645))
y <- data.frame(a=c(309, 115), c=c(799, 814))

y$b <- NA

z <- rbind(x, y)

Resultado:

    a  b   c
1 218 25 950
2 415 19 872
3 339 43 645
4 309 NA 799
5 115 NA 814

Usa el paquete dplyr

Si no quieres escribir una línea extra de código o añadir columnas ficticias a uno de los DataFrames sólo para poder usar rbind, puedes instalar el paquete dplyr y luego simplemente usar:

z <- bind_rows(x, y)

Llena el DataFrame z con la combinación de x y y.

Combinar grandes DataFrames en R

Los ejemplos anteriores funcionan bien con pequeños DataFrames con unas pocas filas y 2 o 3 columnas. Pero cuando necesitas fusionar grandes conjuntos de datos con muchas filas y un número arbitrario de columnas, podría ser mejor escribir una función que haga el trabajo más rápido, como la siguiente:

quickmerge <- function(df1, df2) {
  df1.names <- names(df1)
  df2.names <- names(df2)
  df2.add <- setdiff(df1.names, df2.names)
  df1.add <- setdiff(df2.names, df1.names)
  if(length(df2.add) > 0) {
    for(i in 1:length(df2.add)) {
      df2[df2.add[i]] <- NA
    }
  }
  if(length(df1.add) > 0) {
    for(i in 1:length(df1.add)) {
      df1[df1.add[i]] <- NA
    }
  }
  return(rbind(df1, df2))
}

Esta función comienza comparando los nombres de las columnas en los DataFrames y luego agrega las columnas necesarias para hacerlas iguales. Finalmente, utiliza la función rbind para combinar las filas y devolver el resultado. Para llamar la función, utiliza:

z <- quickmerge(x, y)

El código de ejemplo completo es el siguiente.

quickmerge <- function(df1, df2) {
  df1.names <- names(df1)
  df2.names <- names(df2)
  df2.add <- setdiff(df1.names, df2.names)
  df1.add <- setdiff(df2.names, df1.names)
  if(length(df2.add) > 0) {
    for(i in 1:length(df2.add)) {
      df2[df2.add[i]] <- NA
    }
  }
  if(length(df1.add) > 0) {
    for(i in 1:length(df1.add)) {
      df1[df1.add[i]] <- NA
    }
  }
  return(rbind(df1, df2))
}

x <- data.frame(a=c(218, 415, 339), b=c(25, 19, 43), c=c(950, 872, 645))
y <- data.frame(a=c(309, 115), c=c(799, 814))

z <- quickmerge(x, y)

print(z)

Resultado:

    a  b   c
1 218 25 950
2 415 19 872
3 339 43 645
4 309 NA 799
5 115 NA 814

Artículo relacionado - R Data Frame