Est-il possible de lier en ligne deux trames de données qui n'ont pas le même ensemble de colonnes? J'espère conserver les colonnes qui ne correspondent pas après la liaison.
232
rbind.fill
de l'emballage plyr
pourrait être ce que vous recherchez.
rbind.fill
et lesbind_rows()
deux suppriment silencieusement les noms de domaine.Une solution plus récente consiste à utiliser
dplyr
labind_rows
fonction de qui, je suppose, est plus efficace quesmartbind
.la source
ABC
ne peut pas être convertie de caractère en numérique. Existe-t-il un moyen de convertir les colonnes en premier?Vous pouvez utiliser à
smartbind
partir dugtools
package.Exemple:
la source
smartbind
avec deux grandes trames de données (au total environ 3 * 10 ^ 6 lignes) et je l'ai abandonné après 10 minutes.Si les colonnes de df1 sont un sous-ensemble de celles de df2 (par nom de colonne):
la source
Une alternative avec
data.table
:rbind
fonctionnera égalementdata.table
tant que les objets sont convertis endata.table
objets, doncfonctionnera également dans cette situation. Cela peut être préférable lorsque vous avez quelques data.tables et que vous ne voulez pas construire de liste.
la source
intersect
approche, ne fonctionnent que pour 2 trames de données et ne se généralisent pas facilement.La plupart des réponses R de base concernent le cas où un seul data.frame a des colonnes supplémentaires ou que le data.frame résultant aurait l'intersection des colonnes. Étant donné que l'OP écrit, j'espère conserver les colonnes qui ne correspondent pas après la liaison , une réponse utilisant des méthodes de base R pour résoudre ce problème vaut probablement la peine d'être publiée.
Ci-dessous, je présente deux méthodes R de base: une qui modifie les data.frames d'origine et une qui ne le fait pas. De plus, je propose une méthode qui généralise la méthode non destructive à plus de deux data.frames.
Tout d'abord, obtenons quelques exemples de données.
Deux data.frames, modifier les originaux
Afin de conserver toutes les colonnes des deux data.frames dans un
rbind
(et permettre à la fonction de fonctionner sans entraîner d'erreur), vous ajoutez des colonnes NA à chaque data.frame avec les noms manquants appropriés remplis en utilisantsetdiff
.Maintenant,
rbind
-emNotez que les deux premières lignes modifient les data.frames d'origine, df1 et df2, en ajoutant l'ensemble complet de colonnes aux deux.
Deux data.frames, ne modifient pas les originaux
Pour laisser les data.frames d'origine intacts, parcourez d'abord les noms qui diffèrent, renvoyez un vecteur nommé des NA qui sont concaténés dans une liste avec data.frame en utilisant
c
. , Puisdata.frame
convertit le résultat en un data.frame appropriérbind
.De nombreux cadres de données ne modifient pas les originaux
Dans le cas où vous avez plus de deux cadres de données, vous pouvez effectuer les opérations suivantes.
Peut-être un peu plus agréable de ne pas voir les noms de lignes des data.frames d'origine? Alors fais ça.
la source
mydflist <- list(as, dr, kr, hyt, ed1, of)
. Cela devrait construire un objet liste qui n'augmente pas la taille de votre environnement, mais pointe simplement vers chaque élément de la liste (tant que vous ne modifiez aucun contenu par la suite). Après l'opération, supprimez l'objet liste, juste pour être sûr.Vous pouvez également simplement extraire les noms de colonnes communs.
la source
J'ai écrit une fonction pour ce faire parce que j'aime mon code pour me dire si quelque chose ne va pas. Cette fonction vous indiquera explicitement quels noms de colonnes ne correspondent pas et si vous avez une incompatibilité de type. Ensuite, il fera de son mieux pour combiner les data.frames de toute façon. La limitation est que vous ne pouvez combiner que deux data.frames à la fois.
la source
J'ai peut-être mal lu votre question, mais le message "J'espère conserver les colonnes qui ne correspondent pas après la liaison" me fait penser que vous recherchez une
left join
ouright join
similaire à une requête SQL. R a lamerge
fonction qui vous permet de spécifier des jointures gauche, droite ou internes similaires à la jointure de tables dans SQL.Il y a déjà une grande question et réponse sur ce sujet ici: Comment joindre (fusionner) des trames de données (interne, externe, gauche, droite)?
la source
gtools / smartbind n'aimait pas travailler avec Dates, probablement parce que c'était as.vectoring. Voici donc ma solution ...
la source
Juste pour la documentation. Vous pouvez essayer la
Stack
bibliothèque et sa fonctionStack
sous la forme suivante:J'ai également l'impression qu'elle est plus rapide que les autres méthodes pour les grands ensembles de données.
la source
Vous pouvez également utiliser
sjmisc::add_rows()
, qui utilisedplyr::bind_rows()
, mais contrairement àbind_rows()
,add_rows()
préserve les attributs et est donc utile pour les données étiquetées .Voir l'exemple suivant avec un ensemble de données étiqueté. La
frq()
fonction-imprime des tables de fréquences avec des étiquettes de valeur, si les données sont étiquetées.la source
la source