2010-02-28 11 views
4

J'essaye de fusionner deux data.frames ensemble, basé sur un nom de colonne commun dans chacun d'eux appelé series_id. Voici ma déclaration de fusion:Comment fusionner deux data.frames ensemble dans R, référençant une table de recherche

merge(test_growth_series_LUT, test_growth_series, by = intersect(series_id, series_id)) 

L'erreur que je reçois est

Erreur dans as.vector (y): objet 'series_id' not found

L'aide donne cette description, mais je ne vois pas pourquoi il ne peut pas trouver le series_id. Les données d'exemple sont ci-dessous.

### S3 method for class 'data.frame': 
    #merge(x, y, by = intersect(names(x), names(y)), 
    #  by.x = by, by.y = by, all = FALSE, all.x = all, all.y = all, 
    #  sort = TRUE, suffixes = c(".x",".y"), ...) 



# Create a long data.frame to store data... 
test_growth_series = data.frame ("read_day" = c(0, 3, 9, 0, 3, 9, 0, 2, 8), 
"series_id" = c("p1s1", "p1s1", "p1s1", "p1s2", "p1s2", "p1s2", "p3s4", "p3s4", "p3s4"), 
"mean_od" = c(0.6, 0.9, 1.3, 0.3, 0.6, 1.0, 0.2, 0.5, 1.2), 
"sd_od" = c(0.1, 0.2, 0.2, 0.1, 0.1, 0.3, 0.04, 0.1, 0.3), 
"n_in_stat" = c(8, 8, 8, 8, 7, 5, 8, 7, 2) 
) 

# Create a name LUT 
test_growth_series_LUT = data.frame ("series_id" = c("p1s1", "p1s2", "p3s4", "p4s2", "p5s2", "p6s2", "p7s4", "p8s4", "p9s4"),"description" = c("blah1", "blah2", "blah3", "blah4", "blah5", "blah6", "blah7", "blah8", "blah9") 
) 

> test_growth_series 
    read_day series_id mean_od sd_od n_in_stat 
1  0  p1s1  0.6 0.10   8 
2  3  p1s1  0.9 0.20   8 
3  9  p1s1  1.3 0.20   8 
4  0  p1s2  0.3 0.10   8 
5  3  p1s2  0.6 0.10   7 
6  9  p1s2  1.0 0.30   5 
7  0  p3s4  0.2 0.04   8 
8  2  p3s4  0.5 0.10   7 
9  8  p3s4  1.2 0.30   2 
> test_growth_series_LUT 
    series_id description 
1  p1s1  blah1 
2  p1s2  blah2 
3  p3s4  blah3 
4  p4s2  blah4 
5  p5s2  blah5 
6  p6s2  blah6 
7  p7s4  blah7 
8  p8s4  blah8 
9  p9s4  blah9 
> 



this is what I'm trying to achieve: 
> new_test_growth_series 
    read_day series_id mean_od sd_od n_in_stat  description 
1  0  p1s1  0.6 0.10   8  blah1 
2  3  p1s1  0.9 0.20   8  blah1 
3  9  p1s1  1.3 0.20   8  blah1 
4  0  p1s2  0.3 0.10   8  blah2 
5  3  p1s2  0.6 0.10   7  blah2 
6  9  p1s2  1.0 0.30   5  blah2 
7  0  p3s4  0.2 0.04   8  blah3 
8  2  p3s4  0.5 0.10   7  blah3 
9  8  p3s4  1.2 0.30   2  blah3 
+1

Je pense que vous lisiez juste trop à la lettre ... "par = Intersection (noms (x), les noms (y))" signifie, « vous peut spécifier un nom à joindre (par exemple par = "id"), mais la valeur par défaut est l'intersection des noms de x et des noms de y. " –

Répondre

9

Vous pouvez simplement faire ceci:

merge(test_growth_series_LUT, test_growth_series) 

Il correspondra automatiquement les noms. Si vous devez spécifier la colonne, vous le faites comme ceci:

merge(test_growth_series_LUT, test_growth_series, by = "series_id") 

Ou cette façon, si vous devez spécifier des deux côtés (uniquement nécessaire si elles ont des noms différents que vous souhaitez apparier):

.
merge(test_growth_series_LUT, test_growth_series, by.x = "series_id", by.y = "series_id") 

Je recommande de regarder les exemples (et la marche à travers eux) en allant à l'aide pour la fusion (?merge) ou en appelant example("merge", "base") (moins utile que la marche fait par vous-même

Deux notes:

  1. Vous n'auriez jamais besoin d'utiliser la fonction d'intersection ici. Utilisez c() pour spécifier explicitement plusieurs noms de colonne. Ou utilisez les paramètres all, all.x et all.y pour spécifier le type de jointure souhaité.
  2. Vous utiliseriez des guillemets pour spécifier un nom de colonne dans la plupart des cas, sauf si vous avez joint les données. Sinon, il se plaindra de ne pas être en mesure de localiser le nom. En particulier, le nom doit être dans le chemin de recherche lorsque vous n'utilisez pas de guillemets.
+0

notes d'annonce 2) dans la fusion, il doit s'agir du nom ou de la position logique/numérique de la colonne – Marek

0

L'erreur que je reçois est "Erreur dans as.vector (y): objet 'series_id' not found"

Une colonne dans votre data.frame peut être appelé comme ceci: test_growth_series$series_id, qui retourne le vecteur de ID_série. Faire l'Intersect est inutile, mais serait écrit correctement comme ceci:

intersect(test_growth_series$series_id, test_growth_series_LUT$series_id) 

Pour être un peu plus correct, vous voulez probablement faire une jointure gauche en utilisant all.x=TRUE. Cela vous couvre dans le cas où un ID_série de test_growth_series n'apparaît pas dans votre table de recherche. Sans cela, vous pourriez finir par manquer des lignes dans votre résultat.

merge(test_growth_series, test_growth_series_LUT, by = "series_id", all.x=TRUE) 

Ce sujet est également abordé dans How to join data frames in R (inner, outer, left, right)?