2010-10-26 3 views
2

Je me demande s'il y a une meilleure façon de mettre deux data.frames en un, en traitant les noms comme si c'était une colonne et ensuite fusionner par cette colonne avec un autre data.frame. Je sais que je pouvais faire ce qui suitComment faire pour fusionner sur une colonne par un autre nom de données.

df1$rn <- row(df1) 
all <- merge(df1,df2, by.x="rn", by.y="some_column") 

Je veux dire cela produit des données redondantes (rownames comme colonne) qui ne sont pas nécessaires du tout. Alors, quelle est la façon la plus intelligente de le faire?

+0

@Roger Pate: Pourquoi n'est-ce pas les bases? –

+0

Quelles sont les "bases" de R? [Le méta-tagging est déconseillé.] (Http://meta.stackexchange.com/questions/51627/should-we-permanently-remove-the-subjective-tag/60015#60015) –

+0

Merci de m'avoir indiqué cela. Je ne savais pas à ce sujet. Je ne mettra pas la méta-étiquette dans le futur, même si j'ai une réponse claire (subjective) à votre question. J'ai UTILISÉ pour marquer les bases de r, quand j'ai senti que j'aurais pu trouver la réponse dans l'aide ou sur google mais n'ai pas cherché la bonne manière, par ex. Parce qu'il est difficile de rechercher des opérateurs. Donc, fondamentalement, cela signifie que je me suis rendu compte que c'était une question facile mais j'espère avoir de l'aide immédiate et des informations ou des discussions supplémentaires sur la question. –

Répondre

2

Vous pouvez utiliser "row.names" ou 0 comme index pour les noms de ligne.

Un exemple en utilisant le authors et books de merge aide:

rownames(authors) <- authors$surname 
merge(authors, books, by.x = "row.names", by.y = "name") 
1

« Une façon plus intelligente » dépend vraiment de vos données, que nous n'avons pas. mais

df1 <- data.frame(
    X1 = 1:10, 
    id = letters[1:10] 
) 

df2 <- data.frame(
    X2 = 10:1, 
    X3 = letters[11:20] 
) 
rownames(df2) <- df1$id 
df2 <- df2[sample.int(10),] 

cbind(df1,df2[match(df1$id,rownames(df2)),]) 

Modifier: La réponse de Vitoshka est celle que vous cherchez. Si je avais pris la peine de regarder les fichiers d'aide de ?merge, je l'aurais su que bien ...

Je laisse ma solution ici juste au cas où quelqu'un a besoin d'une solution de rechange rapide de fusionner:

> system.time(replicate(1000,cbind(df1,df2[match(df1$id,rownames(df2)),]))) 
    user system elapsed 
    0.57 0.00 0.57 
> system.time(replicate(1000,merge(df1,df2,by.x="id",by.y="row.names"))) 
    user system elapsed 
    2.36 0.02 2.37 
+0

honte sur moi, je regarde le fichier d'aide, mais avec impatience seulement les exemples. Désolé. Merci pour l'aide! Et c'est vraiment intéressant de voir la différence. Peut-être que supposer qu'il y avait une façon intelligente de le faire, était la plus grande erreur que de ne pas regarder l'aide. –

+1

@ ran2: En général, une fois que vous êtes en Perl-land, vous savez qu'il y a toujours plusieurs façons de le faire. Et quand vous serez de retour en R, vous réaliserez bientôt qu'il y a aussi des façons de le faire mais que vous ne devriez pas faire. –