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.

eivindhammers
fuente
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)
mdsumner
fuente
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"
mfherman
fuente
-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

ami
fuente
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