R - Concatenar dois quadros de dados?

129

Dados dois quadros de dados ae b:

> a
           a           b           c
1 -0.2246894 -1.48167912 -1.65099363
2  0.5559320 -0.87898575 -0.15634590
3  1.8469466 -0.01487524 -0.53098215
4 -0.6875051  0.23880967  0.01824621
5 -0.6735163  0.75485292  0.44154092


> b
           a          c
1  0.4287284 -0.3295925
2  0.5201492  0.3341251
3 -2.6355570  1.7916780
4 -1.3645337  1.3642276
5 -0.4954542 -0.6660001

Existe uma maneira simples de concatená-las para retornar um novo quadro de dados do formulário abaixo?

> new
           a                   b           c
1  -0.2246894   -1.48167912106676 -1.65099363
2   0.5559320  -0.878985746842256 -0.15634590
3   1.8469466 -0.0148752354840942 -0.53098215
4  -0.6875051   0.238809666690982  0.01824621
5  -0.6735163   0.754852923524198  0.44154092
6   0.4287284                  NA -0.32959248
7   0.5201492                  NA  0.33412510
8  -2.6355570                  NA  1.79167801
9  -1.3645337                  NA  1.36422764
10 -0.4954542                  NA -0.66600006

Quero mesclar os quadros de dados, combinar os cabeçalhos e inserir NAposições no quadro de dados em bque o cabeçalho está ausente.

Darren J. Fitzpatrick
fonte
3
Eu presumo que você já tentou merge()? Por que isso não funciona?
Andrie
2
Eu não fiz o Andrie - você também o marcará com +1 por me fazer ir doh!
Darren J. Fitzpatrick
16
Estou confuso. A operação de Darren não é uma junção - não há "produto cartesiano". Pelo contrário, é uma concatenação direta. Então, como as junções ajudam?
Dfrankow 03/12/19

Respostas:

225

Você quer "rbind".

b$b <- NA
new <- rbind(a, b)

O rbind requer que os quadros de dados tenham as mesmas colunas.

A primeira linha adiciona a coluna b ao quadro de dados b.

Resultados

> a <- data.frame(a=c(0,1,2), b=c(3,4,5), c=c(6,7,8))
> a
  a b c
1 0 3 6
2 1 4 7
3 2 5 8
> b <- data.frame(a=c(9,10,11), c=c(12,13,14))
> b
   a  c
1  9 12
2 10 13
3 11 14
> b$b <- NA
> b
   a  c  b
1  9 12 NA
2 10 13 NA
3 11 14 NA
> new <- rbind(a,b)
> new
   a  b  c
1  0  3  6
2  1  4  7
3  2  5  8
4  9 NA 12
5 10 NA 13
6 11 NA 14
dfrankow
fonte
9
Se você estiver conseguindo a união de mais de 2 quadros de dados, poderá usá Reduce(rbind, list_of_data_frames)-los para misturá-los todos juntos!
Yourpalal 13/08/2015
1
se você está rbindvindo da base por algum motivo estranho: eu useirbind.data.frame
Boern
34

Experimente o pacote plyr :

rbind.fill(a,b,c)
Rnoob
fonte
9
Evite usar pacotes externos para tarefas simples.
Fernando Fernando
24
Mais claro e fácil do que invadir colunas extras apenas para agradar; este é o caminho certo a seguir. Evitar pacotes extremamente comuns, como plyrquando oferece as ferramentas certas para o trabalho, simplesmente não é sensato.
precisa saber é o seguinte
2
Esta função automaticamente faz a fusão do fator. É significativamente melhor que a resposta aceita. plyré um pacote comum terrível.
HelloWorld 28/11
23

você pode usar a função

bind_rows(a,b)

da biblioteca dplyr

Adam Lee Perelman
fonte
2
Diferentemente de cbind ( rbind), essa função não altera o tipo de todas as colunas (linhas) para factorse houver um vetor de caracteres.
Azim
11

Aqui está uma pequena função simples que reunirá dois conjuntos de dados após detectar automaticamente quais colunas estão faltando em cada uma e adicioná-las com todos os NAs.

Por qualquer motivo, isso retorna MUITO mais rápido em conjuntos de dados maiores que o uso da mergefunção.

fastmerge <- function(d1, d2) {
  d1.names <- names(d1)
  d2.names <- names(d2)

  # columns in d1 but not in d2
  d2.add <- setdiff(d1.names, d2.names)

  # columns in d2 but not in d1
  d1.add <- setdiff(d2.names, d1.names)

  # add blank columns to d2
  if(length(d2.add) > 0) {
    for(i in 1:length(d2.add)) {
      d2[d2.add[i]] <- NA
    }
  }

  # add blank columns to d1
  if(length(d1.add) > 0) {
    for(i in 1:length(d1.add)) {
      d1[d1.add[i]] <- NA
    }
  }

  return(rbind(d1, d2))
}
Mike Monteiro
fonte
1
Essa pequena função é dinamite.
Dirk Dirk
Agradável. Eu só queria postar a mesma resposta :-). Uma melhoria: @Anton lançou o NApara doubleem sua resposta. Seria bom quando o tipo da nova coluna fosse do mesmo tipo que a coluna existente no outro quadro de dados. Talvez via mode(d2[d2.add[i]]) <- mode(d1[d2.add[i]]). Mas não tenho certeza se esse é o caminho apropriado.
Daniel.heydebreck
3

Você pode usar, rbindmas, nesse caso, você precisa ter o mesmo número de colunas nas duas tabelas, portanto, tente o seguinte:

b$b<-as.double(NA) #keeping numeric format is essential for further calculations
new<-rbind(a,b)
Anton
fonte