Para simplificar mi problema, voy a empezar por el origen en lugar de explicar mi problema de mapa completo.
Tengo un shapefile de Etiopía sacado de GADM ( puede descargarse aquí ). Muchas de las columnas de atributos son innecesarias y sólo crean una confusión adicional cuando realizo recortes/uniones/etc. con el shapefile. Así que quiero eliminar todas las columnas excepto las 4 primeras. Hacer esto parece bastante fácil, y he intentado y tenido éxito con este poco de código:
library(rgdal)
#read in shapefile
eth <- readOGR(dsn = "D:/Mapping-R/Ethiopia", layer = "ETH_adm0")
#subset data/remove columns
eth <- eth@data[, -(5:67)]
En efecto, esto me deja sólo con las 4 primeras columnas, pero también hace que el objeto sea un marco de datos normal en lugar de un marco de datos espacial listo para el mapeo. Entonces, ¿cómo puedo eliminar estas columnas no deseadas manteniendo el estado de SPDF?
3 votos
eth@data <- eth@data[, -(5:67)]
2 votos
¡¡Eck!! ¡No uses ranuras! eth <- eth[, -(5:67)]
1 votos
También, vea ?raster::getData para obtener estos datos dinámicamente.
0 votos
Para ampliar la respuesta correcta de @hrbrmstr, estás sustituyendo el objeto sp por el data.frame asociado que estás subconjuntando. Quieres que la ranura <at>data opere sobre la ranura <at>data que contiene un objeto data.frame. Por lo tanto, usted necesita la llamada de la ranura en ambos lados del operador. En la versión anterior de sp no acceder a la ranura <at>data arrojaría un error pero ahora también puedes seguir la otra recomendación ya que es correcta en las versiones actuales. Sin embargo, hay casos, concretamente con la indexación, en los que es necesario llamar directamente al slot <at>data.
0 votos
@Jeffrey Evans, @mdsumner : Ambos enfoques con y sin
@data
ha funcionado, así que problema resuelto. Me acerqué mucho por mi cuenta, jaja. PERO todavía soy bastante nuevo en R, por lo que la lógica detrás de por qué o por qué no es una mala idea es un poco perdido en mí. :( Cuidado de explicar como si tuviera 5 años?2 votos
Es lo mismo en este caso (aunque yo haría
eth <- eth[, 1:4]
). Pero utilizando el@
no es seguro porque se realizan directamente cambios en la estructura interna de un objeto sin tener en cuenta las consecuencias. ¿Quizás otros valores también deban cambiar en alguna parte de esa estructura? No creo que sea el caso aquí, pero es mejor dejar que los desarrolladores piensen en eso y que tú utilices las funciones que ellos proporcionan para hacer la tarea.