2011-11-08 4 views
5

Continuo a leggere sull'importanza della funzionalità vettoriale, quindi spero che qualcuno possa aiutarmi qui.Valori di ricerca in modo vettorializzato

Dire che ho un frame di dati con due colonne: nome e ID. Ora ho anche un altro frame di dati con nome e luogo di nascita, ma questo frame di dati è molto più grande del primo e contiene alcuni ma non tutti i nomi dal primo frame di dati. Come posso aggiungere una terza colonna alla prima tabella popolata con le birthplaces cercate usando la seconda tabella.

Quello che ho è ora è:

corresponding.birthplaces <- sapply(table1$Name, 
    function(name){return(table2$Birthplace[table2$Name==name])}) 

Questo sembra inefficiente. Pensieri? Qualcuno sa di un buon libro/risorsa per usare R 'correttamente' .. Ho la sensazione che generalmente penso che sia concepibile nel modo meno efficace dal punto di vista computazionale.

Grazie :)

+1

Dai un'occhiata alla 'match'? – Andrie

risposta

6

Vedi ?merge che eseguire una stampa database link o unirsi.

Ecco un esempio:

set.seed(2) 
d1 <- data.frame(ID = 1:5, Name = c("Bill","Bob","Jessica","Jennifer","Robyn")) 
d2 <- data.frame(Name = c("Bill", "Gavin", "Bob", "Joris", "Jessica", "Andrie", 
          "Jennifer","Joshua","Robyn","Iterator"), 
       Birthplace = sample(c("London","New York", 
             "San Francisco", "Berlin", 
             "Tokyo", "Paris"), 10, rep = TRUE)) 

che dà:

> d1 
    ID  Name 
1 1  Bill 
2 2  Bob 
3 3 Jessica 
4 4 Jennifer 
5 5 Robyn 
> d2 
     Name Birthplace 
1  Bill  New York 
2  Gavin   Tokyo 
3  Bob  Berlin 
4  Joris  New York 
5 Jessica   Paris 
6 Andrie   Paris 
7 Jennifer  London 
8 Joshua   Paris 
9  Robyn San Francisco 
10 Iterator  Berlin 

Poi usiamo merge() di fare il join:

> merge(d1, d2) 
     Name ID Birthplace 
1  Bill 1  New York 
2  Bob 2  Berlin 
3 Jennifer 4  London 
4 Jessica 3   Paris 
5 Robyn 5 San Francisco 
Problemi correlati