2010-10-06 6 views
1

J'ai deux trames de données que les deux ont une colonne contenant un facteur comme ce qui suit:méthode idiomatiques R pour « gauche joignant » deux trames de données

> head(test.data) 
     var0  var1  date store 
1 109.5678 109.5678 1990-03-30 Store1 
2 109.3009 108.4261 1990-06-30 Store1 
3 108.8262 106.2517 1990-09-30 Store1 
4 108.2443 108.6417 1990-12-30 Store1 
5 109.5678 109.5678 1991-03-30 Store1 
6 109.3009 108.4261 1991-06-30 Store1 
> summary(test.data) 
     var0    var1    date    store 
Min. : -9.72 Min. : -2.297 Min. :1990-03-30 Store1 : 8 
1st Qu.: 68.32 1st Qu.: 71.305 1st Qu.:1990-09-07 Store2 : 8 
Median :102.19 Median :101.192 Median :1991-02-13 Store3 : 8 
Mean :101.09 Mean :103.042 Mean :1991-02-13 Store4 : 8 
3rd Qu.:151.22 3rd Qu.:151.940 3rd Qu.:1991-07-23 Store5 : 8 
Max. :196.55 Max. :201.099 Max. :1991-12-30 Store6 : 8 
                 (Other):48 
> 
> head(test.clusters) 
    store cluster 
1 Store1  A 
2 Store2  C 
3 Store3  A 
4 Store4  B 
5 Store5  D 
6 Store6  A 
> 
> summary(test.clusters) 
    store cluster 
Store1 :1 A:5  
Store2 :1 B:4  
Store3 :1 C:2  
Store4 :1 D:1  
Store5 :1   
Store6 :1   
(Other):6   
> 

Je veux ajouter une colonne à test.data contenant cluster de chaque ligne , en fonction de leur partagé store. Je suis actuellement ce en utilisant une boucle double imbriqué:

new_col <- rep(test.clusters$cluster[1], length(test.data$store)) 
for (i in seq(test.data$store)){ 
    for (j in seq(test.clusters$store)){ 
    if (test.data$store[i] == test.clusters$store[j]){ 
     new_col[i] <- test.clusters$cluster[j] 
     break 
    }  
    } 
} 
test.data$cluster <- new_col 

Ceci est très bavard, totalement inefficace et franchement laid. Quelle est la méthode idiomatique pour faire cela dans R?

Répondre

7

Utilisez la fonction merge.

+3

+1 Voir aussi http://stackoverflow.com/questions/3515611/merge-command-in-r et http://stackoverflow.com/questions/2232699/r-how-to-do-a-data -table-merge-operation par exemple, ou faire une recherche sur "merge [r]" sur le site. –

+0

Je vais regarder dans - ne savais pas quel mot-clé à rechercher! – fmark

2

Je recommande match. Ce sera beaucoup plus rapide que merge.

Il devrait ressembler à ceci:

test.data$cluster <- test.clusters$cluster[match(test.data$store, test.clusters$store)] 
8

Utilisez la fonction join de plyr. Il utilise la correspondance interne, donc devrait être rapide (4-10x plus rapide que la fusion).

+0

Notez que cela ne fonctionne qu'avec la version actuelle de plyr. Si vous êtes bloqué sur une ancienne version de R, pour quelque raison que ce soit, ce ne sera pas une option. – Harlan

Questions connexes