Combinar dois data frames em R

  1. Utilize rbind para combinar dois data frames em R
  2. Utilize o pacote dplyr
  3. Combina grandes moldura de dados em R

Ao manipular dados com código R, enfrentamos frequentemente a necessidade de combinar dois data frames em um. Este tutorial verá alguns métodos para combinar eficazmente dois data frames em R.

Suponha que tem duas molduras de dados, x e y, com algumas colunas correspondentes. Por exemplo:

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))

E precisa de as combinar numa moldura de dados resultante, chamada z, por exemplo. Tais molduras de dados poderiam ser como estas:

R exemplo de moldura de dados

Utilize rbind para combinar dois data frames em R

A função rbind combina estruturas de dados, tais como data frames, vectores, ou matrizes, por filas. O seu nome significa row-bind.

Quando se utiliza a função rbind para combinar duas molduras de dados, ambas as molduras de dados precisam de ter as mesmas colunas. Portanto, no exemplo anterior, é necessário adicionar a coluna b à moldura de dados y. Isto pode ser feito através da execução deste comando:

y$b <- NA

Agora a moldura de dados y deve ter o seguinte aspecto:

Exemplo de moldura de dados R

Agora pode utilizar rbind para combinar as molduras de dados x e y na nova moldura de dados z, executando 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

Utilize o pacote dplyr

Se não quiser escrever uma linha extra de código ou adicionar colunas fictícias a uma das molduras de dados apenas para poder utilizar o ‘rbind’, pode instalar o pacote dplyr e depois simplesmente utilizar:

z <- bind_rows(x, y)

Preenche a moldura de dados z com a combinação de x e y.

Combina grandes moldura de dados em R

Os exemplos anteriores funcionam bem com pequenas molduras de dados com algumas filas e 2 ou 3 colunas. Mas quando é necessário fundir grandes conjuntos de dados com muitas filas e um número arbitrário de colunas, poderia ser melhor escrever uma função que faça o trabalho mais rapidamente, como as seguintes:

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 função começa por comparar os nomes das colunas nos data frames e depois adicionar as colunas necessárias para os tornar iguais. Finalmente, utiliza a função ‘rbind’ para combinar as linhas e devolver o resultado. Para chamar a função, utiliza:

z <- quickmerge(x,y)

O código completo do exemplo é o que se segue.

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