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.


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)

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"

-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


Ç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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.