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:
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í:
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