multiple - pie chart r ggplot2
¿Cómo adjuntar un data.frame simple a un SpatialPolygonDataFrame en R? (5)
Tengo (nuevamente) un problema con la combinación de marcos de datos en R. Pero esta vez, uno es un SpatialPolygonDataFrame ( SPDF
) y el otro es un data.frame ( DF
) habitual. El SPDF
tiene alrededor de 1000 filas, el DF
solo 400. Ambos tienen una columna común, QDGC
Ahora, lo intenté
oo <- merge(SPDF,DF, by="QDGC", all=T)
pero esto solo da como resultado un marco de datos normal, no un marco de datos de polígono espacial. Leí en otro lugar, que esto no funciona, pero no entendí qué hacer en tal caso (tiene que hacer algo con las columnas de ID, usos de fusión)
oooh una pregunta tan difícil, me pregunta ...
¡Gracias! Jens
Deje df = marco de datos, sp = objeto de polígono espacial y por = nombre o número de columna de columna común. A continuación, puede fusionar el marco de datos en el objeto sp utilizando la siguiente línea de código
sp@data = data.frame(sp@data, df[match(sp@data[,by], df[,by]),])
Así es como funciona el código. La función de coincidencia dentro alinea las columnas para que se preserve la orden. Entonces cuando lo fusionamos con sp @ data, el orden se conserva correctamente. Una comprobación rápida para ver si el código ha funcionado es inspeccionar las dos columnas correspondientes a la columna común y ver si son idénticas (las columnas comunes se duplican y es fácil quitar la copia, pero la guardo porque es una buen control)
Es tan fácil como esto:
require(sp) # the trick is that this package must be loaded!
oo <- merge(SPDF,DF, by="QDGC")
Lo he probado solo. Pero solo funciona si usa fusionar del paquete sp . Este es el valor predeterminado cuando se carga el paquete sp
. merge
función de merge
se sobrecarga y se usa sp::merge
si el primer argumento es una estructura espacial.
Tal vez la función joinCountryData2Map
en el paquete rworldmap puede inspirar. (Pero puedo estar equivocado, como lo estuve la última vez).
Una solución más es usar la función tmaptools
paquete tmaptools
. Se llama con estos argumentos:
append_data(shp, data, key.shp = NULL, key.data = NULL,
ignore.duplicates = FALSE, ignore.na = FALSE,
fixed.order = is.null(key.data) && is.null(key.shp))
Es un poco desafortunado que se llame "agregar", ya que entendería añadir más sentido de rbind
y queremos tener algo así como join
o join
aquí.
Ignorando ese hecho, la función es realmente útil para asegurarse de que sus uniones sean correctas y si algunas filas están presentes solo en un lado de la unión. De los documentos:
Bajo cobertura (elementos de forma que no corresponden a registros de datos), la cobertura excesiva (registros de datos que no corresponden a elementos de forma, respectivamente), así como la existencia de valores clave duplicados se verifican automáticamente y se informan a través de mensajes de consola. Con
under_coverage
yover_coverage
se pueden recuperar los valores clave de cobertura inferior y superior de la última llamada append_data,
merge puede producir un dataframe con más filas que los originales si no hay una asignación simple de 1-1 de los dos dataframes. En ese caso, tendría que copiar toda la geometría y crear múltiples polígonos, lo cual probablemente no sea bueno.
Si tiene un marco de datos que tiene el mismo número de filas que un SpatialPointsDataFrame, entonces puede reemplazar directamente la ranura @data.
library(sp)
example(overlay) # to get the srdf object
srdf@data
spplot(srdf)
srdf@data=data.frame(x=runif(3),xx=rep(0,3))
spplot(srdf)
si obtiene el número de filas incorrecto:
srdf@data=data.frame(x=runif(2),xx=rep(0,2))
spplot(srdf)
Error in data.frame(..., check.names = FALSE) :
arguments imply differing number of rows: 3, 2