12
votes

Comment rbind Seules les colonnes communes de deux ensembles de données

J'ai 2 cadres de données avec un nombre différent de colonnes chacune. Certaines des colonnes sont courantes entre les 2 cadres de données. Comment puis-je rbind uniquement les colonnes communes des deux cadres de données à un nouveau cadre de données?

J'ai essayé avec bibliothèque (plyr); rbind.fill (a, b) Cependant, il définit des valeurs na dans les colonnes qui ne correspondent pas, ce qui ne m'aide pas.

merci beaucoup CE

r

0 commentaires

3 Réponses :


34
votes

Utiliser intersect code> pour extraire les colonnes communes.

rbind(
  dfr1[common_cols], 
  dfr2[common_cols]
)


2 commentaires

Très succinct et compréhensible. +1


Pas besoin d'utiliser un sous-ensemble ici - et vous souhaitez généralement éviter la programmation avec une fonction utilisant une évaluation non standard. (Et je ne suis pas sûr de savoir pourquoi vous voudriez l'utiliser car il est plutôt verbeux par rapport à dfr1 [common_cols] )



3
votes

Voici ma solution espère que j'ai eu votre question à droite xxx


4 commentaires

Que se passe-t-il si df2 a des colonnes qui ne sont pas dans df1 ?


En outre, l'appel à sous-ensemble n'est pas nécessaire. Si vous allez utiliser indexation ultérieure, vous pouvez simplement les transmettre le vecteur logique créé par noms (df1)% en% noms (DF2) .


Quant à votre premier commentaire: Si DF2 a des colonnes qui ne sont pas dans DF1 - elles ne sont pas courantes et je ne veux pas les filtrer - ni je me trompe? Quant à votre deuxième commentaire: c'est vrai que ce serait mieux probablement je l'ai fait un peu trop bâclé ...


S'ils sont dans DF2 mais pas dans df1, ils ne sont pas communs, alors vous faire veulent les filtrer. Mon point est que % en% n'est pas symétrique, tandis que intersect est. Vous auriez besoin de bind1 <- df1 [ noms (df1)% en% noms (DF2)]] et bind2 <- df2 [ noms (DF2)% en% noms (DF1) ] .



0
votes

a fait ma propre fonction pour mon colis personnel: (cela fonctionne également pour plus de 2 dataframes)

Fonction: strong> p>

df1 <- mtcars[1:5,1:4]
df2 <- mtcars[6:10,2:5]
df3 <- mtcars[11:15,4:7]
fast.rbind(df1,df2,df3,method="common")
fast.rbind(df1,df2,df3,value="yourDesiredFill")


0 commentaires