2011-03-15 8 views
6

Actualmente estoy explorando la posibilidad de extraer nombre del país de Afiliaciones de los autores (PubMed Artículos) mis datos de la muestra se ve así:Extracción Nombre País de Afiliaciones de los autores

Mechanical and Production Engineering Department, National University of Singapore.

Cancer Research Campaign Mammalian Cell DNA Repair Group, Department of Zoology, Cambridge, U.K.

Cancer Research Campaign Mammalian Cell DNA Repair Group, Department of Zoology, Cambridge, UK.

Lilly Research Laboratories, Eli Lilly and Company, Indianapolis, IN 46285.

Inicialmente traté de eliminar las puntuaciones y dividir el vector en palabras y luego lo comparé con una lista de nombres de países de Wikipedia, pero no tengo éxito en esto.

¿Alguien me puede sugerir por favor una mejor manera de hacerlo? Preferiría la solución en R ya que tengo que hacer más análisis y generar gráficos en R.

+1

Puede que sea mejor si preprocesa el archivo fuera de R, lo guarda como CSV y luego usa R para el resto. Google Refine es una gran herramienta para este tipo de trabajo. – edmz

+0

'Google Refine' también funciona bien! ¡Gracias por la sugerencia! –

Respuesta

6

Aquí hay una solución simple que podría ayudarlo a comenzar. Hace uso de una base de datos que contiene datos de ciudades y países en el paquete de mapas. Si puede obtener una mejor base de datos, debería ser simple modificar el código.

library(maps) 
library(plyr) 

# Load data from package maps 
data(world.cities) 

# Create test data 
aa <- c(
    "Mechanical and Production Engineering Department, National University of Singapore.", 
    "Cancer Research Campaign Mammalian Cell DNA Repair Group, Department of Zoology, Cambridge, U.K.", 
    "Cancer Research Campaign Mammalian Cell DNA Repair Group, Department of Zoology, Cambridge, UK.", 
    "Lilly Research Laboratories, Eli Lilly and Company, Indianapolis, IN 46285." 
) 

# Remove punctuation from data 
caa <- gsub(aa, "[[:punct:]]", "") ### *Edit* 

# Split data at word boundaries 
saa <- strsplit(caa, " ") 

# Match on cities in world.cities 
# Assumes that if multiple matches, the last takes precedence, i.e. max() 
llply(saa, function(x)x[max(which(x %in% world.cities$name))]) 

# Match on country in world.countries 
llply(saa, function(x)x[which(x %in% world.cities$country.etc)]) 

Este es el resultado de las ciudades:

[[1]] 
[1] "Singapore" 

[[2]] 
[1] "Cambridge" 

[[3]] 
[1] "Cambridge" 

[[4]] 
[1] "Indianapolis" 

Y el resultado para los países:

[[1]] 
[1] "Singapore" 

[[2]] 
[1] "UK" 

[[3]] 
[1] "UK" 

[[4]] 
character(0) 

Con un poco de limpieza de datos que puede ser capaz de hacer algo con esto.

+0

Con un servicio de geocodificación externo es posible que haya encontrado el cuarto, pero su solución es muy buena y se mantiene dentro de R. Habría votado si me quedaban algunos votos :-) – juba

+0

@juba Gracias. Uno puede ampliar esta solución. Por ejemplo, si se encuentra una ciudad pero no un país, se puede buscar el país para la ciudad que se encuentra en el mundo.ciudades – Andrie

+0

'caa <-gsub (" [[: puntual:] \ n] "," ", aa) # Works'' str_replace_all' no funcionaba también 'llply' debería sustituirse por' lapply' muchas gracias @Andrie –

1

Una forma podría ser dividir las cadenas para aislar la información geográfica (por ejemplo, eliminando todo hasta la primera coma) y luego enviar el resultado a un servicio de geocodificación.

Por ejemplo, la API de geocodificación de Google permite enviar una dirección y recuperar una localización y las correspondientes informaciones geográficas, como el país. No creo que hay un paquete de R ya preparado para hacerlo, pero se pueden encontrar algunas de las funciones aquí, por ejemplo:

Geocoding in R with Google Maps

También hay extensiones en otros idiomas como Ruby:

http://geokit.rubyforge.org/

también depende de la cantidad de observaciones que tenga, la libre Google API, por ejemplo se limita a cerca de 200 direcciones/IP/día, si no recuerdo mal.

Cuestiones relacionadas