Extraction de data.frame à partir d'un objet d'entités simples dans R

44

Existe-t-il un moyen sf-native (c'est-à-dire "correct") d'extraire tout sauf la colonne géométrie d'un objet d'entités simple? Cela marche

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

mais l' select( , -geometry)étape semble inutile. En outre, cela ne supprime pas les attributs de géométrie.

eivindhammers
la source
2
Aussi possible avecdf <- st_drop_geometry(df)
Radek le
@radek Aussi dans la version CRAN?
eivindhammers le
Je crois tellement. Actuellement 0.7-2sur le cran. Et il est ici rdocumentation.org/packages/sf/versions/0.7-2/topics/...
radek

Réponses:

36

Définissez la st_geometrypropriété sur 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"

Aussi (même si cela ne supprimera pas le attr(nc, "sf_column"):

nc <-  st_read(system.file("shape/nc.shp", package="sf"), quiet = TRUE)
as.data.frame(nc)
mdsumner
la source
J'avais déjà essayé nc$geometry <- NULL, mais votre suggestion a fait l'affaire. Merci.
eivindhammers
Existe-t-il une version canalisée de cela? sf %>% mutate(geometry = NULL)ne fonctionne pas
obrl_soil
2
Peut-être que ça s'appelle "geom" et pas "geometry"? (Ça ne va jamais être constant). Une autre façon est `x%>% st_set_geometry (NULL)`. L’un ou l’autre de ceux-ci pourrait être en développement, pas CRAN bien que je ne vérifie pas soigneusement où je suis localement
mdsumner
@ mdsumner fait un bon point indirect. Quelqu'un doit réellement écrire la méthode, cela ne se fait pas par magie. Comme sf est une nouvelle classe d'objet dans R, de nombreuses méthodes peuvent ne pas être disponibles ou ne pas se comporter comme prévu.
Jeffrey Evans
35

Voici une approche pipeable pour transformer un objet sf en un simple bloc de données sans géométrie. Utilisez la st_set_geometry()fonction:

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"

MODIFIER

Le 16/11/2018 , a st_drop_geometry()été ajouté à sf, ce qui le fait explicitement:

nc_df2 <- nc %>% st_drop_geometry()
class(nc_df2)
#> [1] "data.frame"
Mfherman
la source
-5
df <- df[,-geometry_column]

Ou juste df[,-geometry_column]si vous ne voulez pas créer de nouvel objet

Où:

df - votre objet

geometry_column - colonne dans laquelle la géométrie est stockée

suis-je
la source
Ça ne marche pas de mon côté. Avez-vous testé? Je fais sf[, -sf$geometry]et reçoisError in Ops.sfc(grid.sf$geometry) : argument "e2" is missing, with no default
eivindhammers le
Essayez sF [, - geometry] pas sf [, - sf $ geometry]
ami
sf[, -geometry]échoue avec Error in -"geometry" : invalid argument to unary operator. Reproduit avecdata(meuse, package = "sp"); meuse_sf <- st_as_sf(meuse); meuse_sf[, -geometry]
eivindhammers le
5
Cela ne fonctionne en aucune façon. Peut-être que c'était le cas dans un sfpaquet précédent , mais maintenant ce n'est pas le cas. Tout sous-ensemble de trames de sfdonnées conserve la colonne de géométrie. Supprime s'il te plaît.
Spacedman