Combinar dois data frames em R
-
Utilize
rbind
para combinar dois data frames em R -
Utilize o pacote
dplyr
- 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:
Utilize rbind
para combinar dois data frames em R
A função rbind
combina estruturas de dados, tais como data frames, vectores, ou arrays, 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:
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