La fusion de deux trames de données tout en gardant la ligne d'origine afin
Je veux fusionner les deux trames de données en gardant l'original de ligne de commande de l'un d'entre eux (df.2
dans l'exemple ci-dessous).
Voici quelques exemples de données (toutes les valeurs de class
colonne sont définis dans les deux trames de données):
df.1 <- data.frame(class = c(1, 2, 3), prob = c(0.5, 0.7, 0.3))
df.2 <- data.frame(object = c('A', 'B', 'D', 'F', 'C'), class = c(2, 1, 2, 3, 1))
Si je fais:
merge(df.2, df.1)
De sortie est:
class object prob
1 1 B 0.5
2 1 C 0.5
3 2 A 0.7
4 2 D 0.7
5 3 F 0.3
Si j'ajoute sort = FALSE
:
merge(df.2, df.1, sort = F)
Résultat est:
class object prob
1 2 A 0.7
2 2 D 0.7
3 1 B 0.5
4 1 C 0.5
5 3 F 0.3
Mais ce que je voudrais, c'est:
class object prob
1 2 A 0.7
2 1 B 0.5
3 2 D 0.7
4 3 F 0.3
5 1 C 0.5
- Le problème n'est pas bien défini. Que faire si vous avez, dans le résultat fusionné, plus ou moins de lignes que le df.2?
- Impossible parce que je utiliser df.2 comme première variable en fonction de fusion...
- Pas de. c'est à tort. encore mal défini. prenons le cas où vous avez une classe dans le df;2 qui n'existent pas dans le df.1.Par exemple :
df.2<-data.frame(object=c('A','B','D','F','C'), class=c(2,1,2,4,1))
- Ok, peut-être, l'édition est de plus précisé. De toute façon, la PAC réponse fait le travail que je cherchais. Merci de m'aider à améliorer la question.
- double possible de Comment puis-je les fusionner et de maintenir la ligne de commande d'une entrée?
Vous devez vous connecter pour publier un commentaire.
Découvrez la fonction join dans le package plyr. C'est comme de fusion, mais il vous permet de garder la ligne de commande de l'un des ensembles de données. Dans l'ensemble, c'est plus souple que la fusion.
À l'aide de vos données d'exemple, nous pourrions utiliser
join
comme ceci:Ici sont un couple de liens décrivant des correctifs à la fonction de fusion pour garder la ligne de commande:
http://www.r-statistics.com/2012/01/merging-two-data-frame-objects-while-preserving-the-rows-order/
http://r.789695.n4.nabble.com/patching-merge-to-allow-the-user-to-keep-the-order-of-one-of-the-two-data-frame-objects-merged-td4296561.html
join
s de la documentation) seraient en désaccord que c'est "plus souple" quemerge
: "Jointure est souvent plus rapide que la fusion, même si elle est un peu moins plein de fonctionnalités - elle propose actuellement aucun moyen de renommer de sortie ou fusionner sur différentes variables x et y des trames de données."?join
: "Contrairement à la fusion, conserve l'ordre de x n'importe quel type de jointure est utilisé. Si nécessaire, des lignes de y sera ajouté à la fin."Il vous suffit de créer une variable qui donne le numéro de ligne dans le df.2. Ensuite, une fois que vous avez fusionné vos données, vous triez le nouveau jeu de données en fonction de cette variable. Voici un exemple :
De les données.tableau v1.9.5+, vous pouvez le faire:
La effectue une jointure sur la colonne
class
par trouver les lignes correspondantes dansdf.1
pour chaque ligne dedf.2
et l'extraction de colonnes correspondantes.Vous pouvez aussi consulter les
inner_join
fonction de Hadley estdplyr
paquet (prochaine itération deplyr
). Il préserve la ligne de commande de la première série de données. La différence mineure désirée pour votre solution, c'est qu'il préserve également l'original de l'ordre des colonnes de la première série de données. Donc, il n'est pas nécessairement la colonne, nous avons utilisé pour la fusion à la première position.À l'aide de votre exemple ci-dessus, le
inner_join
résultat ressemble à ceci:Par souci d'exhaustivité, mise à jour dans une jointure conserve l'original de la ligne de commande ainsi. Ce pourrait être une alternative à Arun est
de données.la table
réponse si il y a seulement quelques colonnes à ajouter:Ici,
df.2
est droit joint àdf.1
et les gains d'une nouvelle colonneprob
qui est copié à partir de la correspondance des lignes dedf.1
.La accepté de répondre à propose un manuel de façon à maintenir l'ordre lors de l'utilisation de
merge
, qui fonctionne la plupart du temps, mais nécessite inutile le travail manuel. Cette solution vient sur le dos de Comment ddply() sans le tri?, qui traite de la question du maintien de l'ordre mais un split-appliquer-combiner contexte:Alors maintenant, vous pouvez utiliser ce générique
keeping.order
fonction de garder la ligne d'origine afin demerge
appel:Qui donnera, comme l'a demandé:
Donc
keeping.order
efficacement automatise l'approche de la accepté de répondre.Grâce à @PAC , je suis venu avec quelque chose comme ceci:
Cela suppose que vous voulez conserver l'ordre de la première trame de données, et les données fusionnées cadre aura le même nombre de lignes que le premier bloc de données. Il vous donnera le propre de la trame de données sans colonnes supplémentaires.
Dans ce cas précis que vous pourriez nous
factor
pour un compact-solution de base:Pas une solution générale cependant, il fonctionne si:
left_join
1 n'est pas négociable, pour le reste on peut le faire:
Il y a plusieurs utilisations cas dans lesquels un simple sous-ensemble fera:
Ce code permettra de préserver df.2 et c'est l'ordre et d'ajouter que le appariement de données provenant de df.1
Si une seule variable est ajoutée, le
cbind()
ist en a pas besoin:Il y a peut être un moyen plus efficace dans la base. Ce serait assez simple pour en faire une fonction.