2011-11-08 22 views
5

Sigo leyendo sobre la importancia de la funcionalidad vectorizada, así que espero que alguien me pueda ayudar aquí.Valores de búsqueda de forma vectorizada

Digamos que tengo un marco de datos con dos columnas: nombre e ID. Ahora también tengo otro marco de datos con nombre y lugar de nacimiento, pero este marco de datos es mucho más grande que el primero, y contiene algunos, pero no todos, los nombres del primer marco de datos. ¿Cómo puedo agregar una tercera columna a la primera tabla que se llena con los lugares de nacimiento buscados usando la segunda tabla?

Lo que tengo es ahora es:

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

Esto parece ineficiente. ¿Pensamientos? ¿Alguien sabe de un buen libro/recurso para usar R 'correctamente' ... Tengo la sensación de que generalmente pienso de la manera menos computacionalmente efectiva concebible.

Gracias :)

+1

Tenga una mirada en 'match'? – Andrie

Respuesta

6

Ver ?merge que realizar una combinación de enlace de base de datos o unirse.

Aquí se muestra un ejemplo:

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)) 

lo que da:

> 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 

A continuación, utilizamos merge() hacer la unión:

> 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 
Cuestiones relacionadas