Tengo un problema molesto para el que intento encontrar una solución automatizada. La versión abreviada es que tengo un shapefile y una tabla de datos creados para las regiones dentro de los países. La tabla de datos creados NO tiene ningún tipo de código GID/admin estandarizado para que coincida con los shapefiles, y los nombres de las regiones tampoco coinciden exactamente. Echemos un vistazo más de cerca; aquí está mi marco de datos ficticio + shapefile.
library(rgdal)
#load in shapefile
arm <- readOGR("D:/Country-Shapefiles/ARM_adm_shp", layer = "ARM_adm1")
#create dummy data frame
id <- c(100:110)
name <- c("Aragatsotn", "Ararat", "Armavir", "Gaghark'unik'", "Kotayk", "Lorri",
"Shirak", "Syunik'", "Tavush", "Vayots' Dzor", "Yerevan City")
value <- runif(11, 0.0, 1.0)
df <- data.frame(id, name, value)
Así que lo que tengo es una tabla con IDs aparentemente aleatorios, nombres de regiones, y un valor para ser trazado con un mapa choropleth. Se parece a esto:
> df
id name value
1 100 Aragatsotn 0.6923852
2 101 Ararat 0.5762024
3 102 Armavir 0.4688358
4 103 Gaghark'unik' 0.4702253
5 104 Kotayk 0.9347992
6 105 Lorri 0.1937813
7 106 Shirak 0.5162604
8 107 Syunik' 0.4332389
9 108 Tavush 0.9889513
10 109 Vayots' Dzor 0.2182024
11 110 Yerevan City 0.5791886
Mirando los atributos shapefile de interés, tenemos esto:
> arm@data[c("ID_1", "NAME_1")]
ID_1 NAME_1
0 1 Aragatsotn
1 2 Ararat
2 3 Armavir
3 4 Erevan
4 5 Gegharkunik
5 6 Kotayk
6 7 Lori
7 8 Shirak
8 9 Syunik
9 10 Tavush
10 11 Vayots Dzor
Idealmente, df
incluiría algún tipo de ID de administrador coincidente para unirlo al shapefile. Lamentablemente, quien creó los datos que estoy utilizando no siguió estas convenciones. Otra posibilidad sería hacer coincidir los nombres de las regiones... pero, como puede ver, hay ligeras variaciones en cada nombre.
El emparejamiento a mano siempre es una solución de reserva, pero ¿quién quiere tomarse el tiempo de hacerlo? ;) Pero en realidad, incluso excluyendo la pereza, el proyecto en el que estoy trabajando va a mapear docenas y docenas de países diferentes, así que estoy buscando una solución automatizada que pueda hacerlo todo sin tener que hacer nada a mano. ¿Es esto posible? ¿Puedo hacer coincidir de algún modo estos nombres -casi- de regiones con los shapefiles?
Sidenote: I'm looking into grepl
para coincidencias parciales de cadenas por esta entrada pero no estoy seguro de que sea una buena solución, ya que tendré que extraer los nombres de las columnas en lugar de introducir cada nombre de región a mano.
EDIT : Cuando comparo los ID a mano, lo que hago es crear una nueva columna en mi marco de datos y añadir los términos que coinciden exactamente con los del shapefile. Lamentablemente, debido a las peculiaridades de los datos, el orden de los nombres tampoco coincide, por lo que sigue siendo necesario introducirlos manualmente. Espero algún tipo de solución completamente automatizada (si es que es posible).
0 votos
Si tienes suerte y tienes el mismo número de registros en el mismo orden tanto en el shapefile como en la tabla, puedes copiar y pegar los nombres en columnas contiguas de una nueva tabla, unirla al shapefile utilizando sus nombres y unirla a la tabla utilizando sus nombres. (O usando una copia de tu shapefile pegar los nombres de la tabla directamente en su dbf en una hoja Excel o Libre/Open Office anterior a 2007). Si no tienes un número exacto de registros uno a uno sino muchos "tramos" largos de ellos puedes mezclar un poco de trabajo manual con copiar y pegar.
0 votos
Esto es lo que acabé haciendo manualmente a mano, pero por desgracia no están en el orden correcto. Incluso si se ordenan alfabéticamente, puede que no funcionen siempre (en este ejemplo, Erevan = Yerevan City, lo que desordena el resto de la lista).