É possível vincular linhas a dois quadros de dados que não possuem o mesmo conjunto de colunas? Espero manter as colunas que não coincidem após o vínculo.
232
rbind.fill
do pacote plyr
pode ser o que você está procurando.
rbind.fill
ebind_rows()
ambos silenciosamente eliminam nomes de domínio.Uma solução mais recente é usar
dplyr
abind_rows
função de que suponho ser mais eficiente quesmartbind
.fonte
ABC
não pode ser convertida de caractere para numérico. Existe uma maneira de converter as colunas primeiro?Você pode usar
smartbind
ogtools
pacote.Exemplo:
fonte
smartbind
com dois grandes quadros de dados (no total aproximadamente 3 * 10 ^ 6 linhas) e abortei-o após 10 minutos.Se as colunas no df1 forem um subconjunto daquelas no df2 (pelos nomes das colunas):
fonte
Uma alternativa com
data.table
:rbind
também funcionarádata.table
enquanto os objetos forem convertidos emdata.table
objetos, portantotambém funcionará nessa situação. Isso pode ser preferível quando você tem algumas tabelas de dados e não deseja construir uma lista.
fonte
intersect
abordagem, funcionam apenas para dois quadros de dados e não são facilmente generalizadas.A maioria das respostas R básicas aborda a situação em que apenas um data.frame possui colunas adicionais ou que o data.frame resultante teria a interseção das colunas. Como o OP escreve , espero manter as colunas que não correspondem após a ligação , provavelmente vale a pena postar uma resposta usando os métodos base R para resolver esse problema.
A seguir, apresento dois métodos R básicos: um que altera o data.frames original e outro que não. Além disso, ofereço um método que generaliza o método não destrutivo para mais de dois data.frames.
Primeiro, vamos obter alguns dados de amostra.
Dois data.frames, altere originais
Para manter todas as colunas de ambos data.frames em um
rbind
(e permitir que a função funcione sem resultar em erro), adicione colunas NA a cada data.frame com os nomes ausentes apropriados preenchidos usandosetdiff
.Agora,
rbind
-emObserve que as duas primeiras linhas alteram os data.frames originais, df1 e df2, adicionando o conjunto completo de colunas a ambos.
Dois data.frames, não alteram os originais
Para deixar os data.frames originais intactos, primeiro faça um loop entre os nomes que diferem, retorne um vetor nomeado de NAs que são concatenados em uma lista com o data.frame usando
c
. Em seguida,data.frame
converte o resultado em um data.frame apropriado para orbind
.Muitos data.frames, não alteram os originais
Caso você tenha mais de dois data.frames, faça o seguinte.
Talvez um pouco melhor não ver os nomes das linhas dos data.frames originais? Então faça isso.
fonte
mydflist <- list(as, dr, kr, hyt, ed1, of)
. Isso deve criar um objeto de lista que não aumente o tamanho do seu ambiente, mas apenas aponte para cada elemento da lista (desde que você não altere nenhum conteúdo posteriormente). Após a operação, remova o objeto de lista, apenas para garantir a segurança.Você também pode simplesmente retirar os nomes das colunas comuns.
fonte
Eu escrevi uma função para fazer isso porque eu gosto do meu código para me dizer se algo está errado. Essa função informará explicitamente quais nomes de colunas não correspondem e se você tem uma incompatibilidade de tipo. Em seguida, fará o possível para combinar os data.frames de qualquer maneira. A limitação é que você pode combinar apenas dois data.frames por vez.
fonte
Talvez eu tenha interpretado mal sua pergunta completamente, mas o "Espero manter as colunas que não coincidem após a ligação" me faz pensar que você está procurando por uma consulta
left join
ouright join
semelhante a uma consulta SQL. R possui amerge
função que permite especificar junções esquerda, direita ou interna semelhantes às junções de tabelas no SQL.Já existe uma ótima pergunta e resposta sobre este tópico aqui: Como unir (mesclar) quadros de dados (interno, externo, esquerdo, direito)?
fonte
O gtools / smartbind não gostava de trabalhar com o Datas, provavelmente porque era como.vector. Então aqui está a minha solução ...
fonte
Apenas para a documentação. Você pode tentar a
Stack
biblioteca e sua funçãoStack
no seguinte formato:Também tenho a impressão de que é mais rápido que outros métodos para grandes conjuntos de dados.
fonte
Você também pode usar
sjmisc::add_rows()
, que usadplyr::bind_rows()
, mas diferentementebind_rows()
,add_rows()
preserva atributos e, portanto, é útil para dados rotulados .Veja o exemplo a seguir com um conjunto de dados rotulado. A
frq()
função-imprime tabelas de frequência com etiquetas de valor, se os dados estiverem rotulados.fonte
fonte