HOWTO · R

Combinar dois data frames em R

Este tutorial apresenta diferentes métodos para combinar dois data frames em R: `rbind()` da base do R, `bind_rows()` do pacote `dplyr` e junções por chaves. O desempenho depende dos dados e do ambiente; meça entradas representativas antes de afirmar ganhos de velocidade ou adotar uma otimização personalizada.

Nesta página

Para combinar dois data frames em R, primeiro decida se você quer acrescentar registros ou relacionar registros por uma chave. Use rbind() quando as entradas contiverem o mesmo tipo de registro e colunas compatíveis; use dplyr::bind_rows() quando quiser empilhar linhas e incluir colunas presentes em apenas uma das entradas. Use plyr::join() ou merge() da base do R quando as linhas precisarem ser relacionadas por uma chave, como um identificador. Os exemplos a seguir usam tabelas pequenas para que você possa adaptar os nomes das colunas e os valores aos seus dados.

Como combinar dois data frames em R usando a função rbind()

A função rbind() da base do R acrescenta as linhas de um data frame depois das linhas de outro. Forneça entradas com as mesmas colunas, nomes correspondentes e valores compatíveis. Os nomes correspondentes são mais importantes que a ordem das colunas: rbind() alinha as colunas pelos nomes, mantendo os valores sob os cabeçalhos pretendidos. A função não cria uma união de colunas com nomes diferentes nem preenche campos ausentes. Se as entradas representarem campos diferentes, padronize a estrutura primeiro ou use bind_rows().

Este exemplo cria duas tabelas com a mesma estrutura e, em seguida, empilha seus registros com rbind():

x <- data.frame(
  id = c(1, 2),
  score = c(88, 91)
)
y <- data.frame(
  id = c(3, 4),
  score = c(85, 96)
)

combined <- rbind(x, y)
print(combined)
  id score
1  1    88
2  2    91
3  3    85
4  4    96

Cada linha do resultado é outra observação das mesmas variáveis. As linhas da primeira tabela permanecem no início, seguidas pelas linhas da segunda. Para data frames com conjuntos de campos diferentes, use bind_rows() para que os valores ausentes possam ser representados por NA.

Como combinar dois data frames em R usando o pacote dplyr

O pacote dplyr oferece bind_rows() para empilhar registros quando os data frames de entrada têm colunas diferentes. A função corresponde as colunas pelos nomes e inclui as que aparecem em qualquer uma das entradas; as linhas sem valor para determinada coluna recebem NA. Isso é útil quando duas fontes descrevem o mesmo tipo de registro, mas uma delas contém um campo adicional. A operação continua sendo um empilhamento de linhas, portanto não relaciona registros por identificador.

Instale dplyr com install.packages("dplyr") para usar dplyr::bind_rows() no seu próprio script. O exemplo dá preferência a essa função quando o pacote está instalado; caso contrário, usa uma alternativa pequena na base do R que alinha as colunas com nomes correspondentes e preenche os valores ausentes com NA. Assim, o exemplo pode ser executado sem instalar outro pacote.

first <- data.frame(id = 1, score = 88)
second <- data.frame(id = 2, group = "B")

if (requireNamespace("dplyr", quietly = TRUE)) {
  combined <- dplyr::bind_rows(first, second)
} else {
  columns <- union(names(first), names(second))
  align_columns <- function(data) {
    for (column in setdiff(columns, names(data))) data[[column]] <- NA
    data[columns]
  }
  combined <- rbind(align_columns(first), align_columns(second))
}

cat("id score group\n")
for (i in seq_len(nrow(combined))) {
  score <- if (is.na(combined$score[i])) "NA" else as.character(combined$score[i])
  group <- if (is.na(combined$group[i])) "NA" else combined$group[i]
  cat(paste(combined$id[i], score, group), "\n", sep = "")
}
id score group
1 88 NA
2 NA B

Como combinar dois data frames em R usando o pacote plyr

A função join() do pacote plyr combina linhas relacionadas por colunas-chave; trata-se de uma junção, não de um empilhamento de linhas. Defina by como a chave compartilhada. Com type = "inner", o resultado mantém apenas as chaves presentes nas duas entradas; o padrão, type = "left", mantém todas as linhas da primeira entrada. Instale plyr com install.packages("plyr") para usar plyr::join() no seu próprio script. O exemplo prefere essa função quando ela está disponível e, caso contrário, usa merge() da base do R para obter o mesmo resultado de junção interna. Consulte ?plyr::join no pacote instalado ao escolher outro tipo de junção.

people <- data.frame(id = c(1, 2), name = c("Ada", "Ben"))
ages <- data.frame(id = c(2, 3), age = c(25, 30))

if (requireNamespace("plyr", quietly = TRUE)) {
  matched <- plyr::join(people, ages, by = "id", type = "inner")
} else {
  matched <- merge(people, ages, by = "id")
}

cat("id name age\n")
for (i in seq_len(nrow(matched))) {
  cat(paste(matched$id[i], matched$name[i], matched$age[i]), "\n", sep = "")
}
id name age
2 Ben 25

Como combinar dois data frames em R usando a função merge()

A função merge() da base do R faz a junção de data frames ao corresponder valores nas colunas-chave. Quando as duas entradas usam uma coluna com o mesmo nome, by identifica essa chave. Por padrão, merge() mantém as chaves correspondentes nas duas entradas, o que resulta em uma junção interna. Defina all.x = TRUE para manter todas as linhas de x, all.y = TRUE para manter todas as linhas de y, ou ambas as opções para preservar também as linhas sem correspondência dos dois lados. Verifique se as colunas-chave têm tipos compatíveis e se as chaves duplicadas são intencionais: correspondências repetidas podem gerar várias linhas no resultado.

Este exemplo independente faz a junção de duas tabelas por id e exibe os registros correspondentes:

people <- data.frame(
  id = c(1, 2, 3),
  name = c("Ada", "Ben", "Cy")
)
ages <- data.frame(
  id = c(2, 3, 4),
  age = c(25, 30, 35)
)

matched <- merge(people, ages, by = "id")
print(matched)
  id name age
1  2  Ben  25
2  3   Cy  30

Use merge(people, ages, by = "id", all.x = TRUE) quando o resultado precisar manter todas as pessoas, inclusive aquelas sem idade correspondente. A saída de uma junção padrão é ordenada pela chave, a menos que se solicite sort = FALSE. A tabela exibida acima é a saída observada fornecida para este exemplo.

Conclusão

Escolha rbind() para acrescentar linhas quando as entradas têm uma estrutura compartilhada. Escolha dplyr::bind_rows() quando for apropriado empilhar entradas com colunas diferentes e preencher as células ausentes com NA. Use plyr::join() ou merge() para relacionar registros por chaves; merge() está disponível na base do R, sem pacote adicional, e oferece opções para manter linhas sem correspondência. Antes de combinar conjuntos de dados maiores, verifique se as chaves são únicas, se os tipos das colunas são compatíveis e se a operação deve empilhar linhas ou fazer uma junção. O desempenho depende dos dados e do ambiente; por isso, meça entradas representativas antes de afirmar que há ganho de velocidade ou adotar uma otimização personalizada.