Las funciones rbind() y cbind() en R

Manipulación de datos con R Transformación de datos
Las funciones rbind() y cbind() en R

La función rbind combina vectores, matrices o data frames por filas, mientras que la función cbind los combina por columnas. En este tutorial aprenderás a utilizar estas funciones en varios casos de uso.

Unir por filas con rbind

Si quieres combinar dos o más vectores de la misma longitud uniéndolos por filas puedes introducirlos en la función rbind. La salida será una matriz con tantas filas como vectores y tantas columnas como elementos.

x <- c(1, 2, 3)
y <- c("G1", "G2", "G3")

# Combinar dos vectores por filas
rbind(x, y)
  [,1] [,2] [,3]
x "1"  "2"  "3" 
y "G1" "G2" "G3"

Si la longitud de los vectores no es igual obtendrás un mensaje de advertencia indicando “number of columns of result is not a multiple of vector length (arg 1)”. En este caso, se reciclarán los elementos de los vectores más pequeños.

Sin embargo, puedes combinar un único valor (numérico o carácter) con un vector y el valor se reciclará a la longitud del vector mayor.

x <- c(1, 2, 3)

# Combinar un entero y un vector
rbind(2, x)
  [,1] [,2] [,3]
     2    2    2
x    1    2    3

Agregar nuevas filas a un data frame o una matriz

Considera el siguiente data frame de ejemplo con tres filas y dos columnas:

df <- data.frame(x = 1:3, y = c("G1", "G2", "G3"))
df
  x  y
1 1 G1
2 2 G2
3 3 G3

Si quieres añadir una nueva fila, puedes introducir el data frame y el vector en rbind, como se muestra a continuación.

df <- data.frame(x = 1:3, y = c("G1", "G2", "G3"))

z <- c(4, "G4") 

# Agregar una nueva fila
df <- rbind(df, z)
df
  x  y
1 1 G1
2 2 G2
3 3 G3
4 4 G4

Ten en cuenta que también puedes introducir varios vectores en la función para añadir varias filas al data frame.

df <- data.frame(x = 1:3, y = c("G1", "G2", "G3"))

z <- c(4, "G4")
w <- c(5, "G5")

# Añadir DOS nuevas filas
df <- rbind(df, z, w)
df
  x  y
1 1 G1
2 2 G2
3 3 G3
4 4 G4
5 5 G5

Combinar data frames por filas

También puedes unir dos o más data frames con la función rbind siempre que tengan el mismo número de columnas y nombres de columna.

df1 <- data.frame(x = 1:3, y = c("G1", "G2", "G3"))

df2 <- data.frame(x = 15:19, y = c("G15", "G16", "G17", "G18", "g19"))

# Unir dos data frames por filas
df <- rbind(df1, df2)
df
   x   y
1  1  G1
2  2  G2
3  3  G3
4 15 G15
5 16 G16
6 17 G17
7 18 G18
8 19 g19

Unir data frames con nombres de columna diferentes

Ten en cuenta que si los nombres de las columnas de los data frames no son iguales no podrás fusionarlos a pesar de que exista un nombre de columna común. En este caso se producirá un error.

df1 <- data.frame(x = 1:3, y = c("G1", "G2", "G3"))

df2 <- data.frame(x = 15:19, z = c("Z1", "Z2", "Z3", "Z4", "Z5"))

# Unir dos data frames
df <- rbind(df1, df2)
df
Error in match.names(clabs, names(xi)) : 
  names do not match previous names

En caso de que necesites unir dos data frames por filas con diferentes nombres de columna o con sólo algunos nombres de columna comunes necesitarás utilizar la función bind_rows de dplyr.

df1 <- data.frame(x = 1:3, y = c("G1", "G2", "G3"))

df2 <- data.frame(x = 15:18, z = c("Z1", "Z2", "Z3", "Z4"))

# Unir dos data frames con nombres de columna diferentes
library(dplyr)

df <- dplyr::bind_rows(df1, df2)
df
   x    y    z
1  1   G1 <NA>
2  2   G2 <NA>
3  3   G3 <NA>
4 15 <NA>   Z1
5 16 <NA>   Z2
6 17 <NA>   Z3
7 18 <NA>   Z4

Etiquetas de fila al unir por filas

La función rbind proporciona un argumento llamado deparse.level que por defecto es 1. Si se establece este argumento a 0 la salida no tendrá etiquetas de fila y cuando se establece a 2 las etiquetas se construirán a partir de los nombres de los argumentos.

x <- c(1, 2, 3)

# Combinar un entero y un vector
rbind(2, x, deparse.level = 0)
     [,1] [,2] [,3]
[1,]    2    2    2
[2,]    1    2    3

Combinar columnas con cbind

La función cbind une vectores, data frames o matrices por columnas. Puedes combinar varios vectores de la misma longitud por columnas pasándolos como entrada a cbind. La función devolverá una matriz con tantas columnas como vectores y tantas filas como elementos tengan los vectores.

x <- c(1, 2, 3)
y <- c("G1", "G2", "G3")

# Combinar dos vectores por columnas
cbind(x, y)
     x   y   
[1,] "1" "G1"
[2,] "2" "G2"
[3,] "3" "G3"

También puedes combinar un único valor numérico o de carácter con otro objeto. En este caso, el valor se repetirá para ajustarse a la longitud del otro objeto.

x <- c(1, 2, 3)

# Combinar un carácter con un vector
cbind("A", x)
         x  
[1,] "A" "1"
[2,] "A" "2"
[3,] "A" "3"

Agregar nuevas columnas

La función permite añadir columnas a un data frame o matriz pasando como entrada los data frames y las nuevas columnas.

df <- data.frame(a = c("A", "B", "C"), b = c(1, 2, 3))

x <- c("AA", "BB", "CC")

# Añadir una nueva columna
cbind(df, x)
     x   y   
[1,] "1" "G1"
[2,] "2" "G2"
[3,] "3" "G3"

Combinar data frames

Además, puedes combinar varios data frames siempre que tengan el mismo número de filas, de lo contrario la función arrojará un error.

df1 <- data.frame(a = c("A", "B", "C"), b = c(1, 2, 3))

df2 <- data.frame(c = c("D", "E", "F"), d = c(4, 5, 6))

# Combinar dos data frames
cbind(df1, df2)
  a b c d
1 A 1 D 4
2 B 2 E 5
3 C 3 F 6

Si el número de filas de los data frames no es el mismo obtendrás un error indicando “arguments imply differing number of rows”.

Etiquetas de las columnas al combinar columnas

El argumento deparse.level de cbind determina las etiquetas de las columnas. Por defecto (1) la función utilizará los nombres de columna de los objetos, si los hay, si se establece como 0 la salida no tendrá nombres de columna y si se pasa un 2 la función siempre construirá nombres de columna a partir de los valores de entrada.

x <- c(1, 2, 3)

# Combinar un entero y un vector
cbind(3, x, deparse.level = 0)
     [,1] [,2]
[1,]    3    1
[2,]    3    2
[3,]    3    3