Extraer data.frame de objetos de características simples en R


44

¿Existe una forma nativa de SF (es decir, "correcta") de extraer todo excepto la columna de geometría de un objeto de características simples? Esto funciona

df <- dplyr::select(as.data.frame(sf), -geometry)

pero el select( , -geometry)paso se siente innecesario. Además, no elimina los atributos de geometría.


2
También es posible condf <- st_drop_geometry(df)
radek

@radek ¿También en la versión CRAN?
eivindhammers

Yo creo que sí. Actualmente 0.7-2en cran. Y está aquí rdocumentation.org/packages/sf/versions/0.7-2/topics/…
radek

Respuestas:


36

Establecer la st_geometrypropiedad a NULL.

library(sf)
nc <-  st_read(system.file("shape/nc.shp", package="sf"), quiet = TRUE)
class(nc)
## [1] "sf"         "data.frame"
st_geometry(nc) <- NULL
class(nc)
## [1] "data.frame"

Además (aunque esto no eliminará attr(nc, "sf_column"):

nc <-  st_read(system.file("shape/nc.shp", package="sf"), quiet = TRUE)
as.data.frame(nc)

Lo había intentado nc$geometry <- NULLantes, pero su sugerencia funcionó. Gracias.
eivindhammers

¿hay una versión canalizada de esto? sf %>% mutate(geometry = NULL)no funciona
obrl_soil

2
Tal vez se llama "geom" y no "geometría"? (Nunca va a ser constante). Otra forma es `x%>% st_set_geometry (NULL)`. Cualquiera de estos podría estar en desarrollo, no CRAN, aunque no estoy verificando cuidadosamente dónde estoy localmente.
mdsumner

@mdsumner hace un gran punto indirecto. Alguien tiene que escribir el método, no sucede por arte de magia. Dado que sf es una nueva clase de objeto en R, muchos métodos pueden no estar disponibles o no comportarse como se esperaba.
Jeffrey Evans

35

Aquí hay un enfoque canalizable para transformar un objeto sf en un marco de datos simple sin geometría. Usa la st_set_geometry()función:

library(sf)
nc <-  st_read(system.file("shape/nc.shp", package="sf"), quiet = TRUE)
class(nc)
#> [1] "sf"         "data.frame"

nc_df <- nc %>% st_set_geometry(NULL)
class(nc_df)
#> [1] "data.frame"

EDITAR

El 16/11/2018 , st_drop_geometry()se agregó a sf, que hace esto explícitamente:

nc_df2 <- nc %>% st_drop_geometry()
class(nc_df2)
#> [1] "data.frame"

-5
df <- df[,-geometry_column]

O simplemente df[,-geometry_column]si no quieres crear un nuevo objeto

Dónde:

df - tu objeto

geometry_column - columna donde se almacena la geometría


No funciona de mi parte. ¿Lo has probado? Lo hago sf[, -sf$geometry]y lo consigoError in Ops.sfc(grid.sf$geometry) : argument "e2" is missing, with no default
eivindhammers

Prueba sF [, - geometry] no sf [, - sf $ geometry]
ami

sf[, -geometry]falla con Error in -"geometry" : invalid argument to unary operator. Reproducir condata(meuse, package = "sp"); meuse_sf <- st_as_sf(meuse); meuse_sf[, -geometry]
eivindhammers

55
Esto no funciona de ninguna manera. Tal vez lo hizo en algún sfpaquete anterior , pero ahora no. Todos los subconjuntos de sfmarcos de datos conservan la columna de geometría. Por favor borrar.
Spacedman el
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.