2010-09-06 20 views
31

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 data.frame (DF). El SPDF tiene alrededor de 1000 filas el DF solamente 400. Ambos tienen una columna común, QDGCCómo adjuntar un simple data.frame a un SpatialPolygonDataFrame en R?

Ahora, he intentado

oo <- merge(SPDF,DF, by="QDGC", all=T) 

pero esto sólo resulta en un data.frame normal, no una trama de datos de polígono espacial nunca más. He leído en otro lado, que esto no funciona, pero no entendí qué hacer en tal caso (tiene que hacer algo con las columnas ID, fusiona usos)

oooh una pregunta tan difícil, me pregunta. ..

Gracias! Jens

Respuesta

40

Deje df = data frame, sp = objeto de polígono espacial y por = nombre o número de columna de la columna común. A continuación, puede fusionar el marco de datos en el objeto sp utilizando la siguiente línea de código

[email protected] = data.frame([email protected], df[match([email protected][,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 buena comprobación)

+1

¡Muchas gracias mucho! ¡Salvaste mi noche! ¡Y probablemente también toda la semana! Funcionó perfectamente bien. – Jens

+0

@Ramnath ¿Funcionará esta solución si el marco de datos espaciales tiene más filas (polígonos) que los datos fusionados? Y también en caso opuesto: ¿cuándo hay más observaciones en datos unidos? – radek

+0

¿Cómo sería esto diferente si ambos objetos son 'SpatialP * DataFrame's? – gregmacfarlane

6

merge puede producir un marco de datos con más filas que los originales si no hay un simple mapeo 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 con el mismo número de filas que SpatialPointsDataFrame, puede simplemente reemplazar directamente la ranura @data.

library(sp) 
example(overlay) # to get the srdf object 
[email protected] 
spplot(srdf) 
[email protected]=data.frame(x=runif(3),xx=rep(0,3)) 
spplot(srdf) 

si se obtiene el número de filas equivocada:

[email protected]=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 
+0

bien hice lo siguientes aparatos: (1) oo <- merge (SPDF, DF, por = "QDGC" , all = T) (2) SPDF @ data <- oo (3) plot (SPDF) los datos están ahora allí pero en un orden muy incorrecto. quizás debería ordenar algo? – Jens

+0

ouch. debería haber verificado eso. – Spacedman

2

Tal vez la función joinCountryData2Map en el paquete rworldmap puede dar inspiración. (Pero puedo estar equivocado, como la vez anterior)

16

es tan fácil como esto:

require(sp) # the trick is that this package must be loaded! 

oo <- merge(SPDF,DF, by="QDGC") 

he probado por mí mismo. Pero solo funciona si usa merge from package sp. Este es el valor predeterminado cuando se carga el paquete sp. La función merge está sobrecargada y se usa sp::merge si el primer argumento es la estructura espacial.

+1

¡Esto funcionó muy bien para mí! Sin embargo, creo que vale la pena señalar que algunos problemas pueden aparecer si el marco de datos y el SPDF no tienen el mismo número de filas. Seguí recibiendo un error ("número de objetos no coinciden") originado por este problema. Finalmente, pude realizar la fusión agregando "all.x = TRUE" (donde x es el SPDF). –

0

Una solución más es usar la función append_data del 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 lamentable que se llama append ya lo entendería anexar sentido más ina de rbind y queremos tener algo así como join o merge aquí.

Ignorando este 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. A partir de los documentos:

Bajo la cobertura (forma de los elementos que no corresponden a los registros de datos), más de cobertura (los conjuntos de datos que no corresponden a la forma de los elementos respectivamente), así como la existencia de valores de clave duplicados son automáticamente comprobado e informado a través de mensajes de consola. Con under_coverage y over_coverage el debajo y por encima de cobertura clave valores a partir de la última llamada append_data puede ser recuperada,

Cuestiones relacionadas