Extrahieren von data.frame aus einem Objekt mit einfachen Features in R

43

Gibt es eine sf-native (dh "richtige") Möglichkeit, alles außer der Geometriespalte aus einem einfachen Feature-Objekt zu extrahieren? Das funktioniert

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

aber der select( , -geometry)schritt fühlt sich unnötig an. Außerdem werden die Geometrieattribute nicht entfernt.

eivindhammers
quelle
2
Auch möglich mitdf <- st_drop_geometry(df)
radek
@radek Auch in der CRAN-Version?
Eivindhammers
Ich glaube schon. Derzeit 0.7-2auf Kran. Und es ist hier rdocumentation.org/packages/sf/versions/0.7-2/topics/…
radek

Antworten:

36

Setzen Sie die st_geometryEigenschaft auf 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"

Auch (obwohl dies das nicht entfernt attr(nc, "sf_column"):

nc <-  st_read(system.file("shape/nc.shp", package="sf"), quiet = TRUE)
as.data.frame(nc)
mdsumner
quelle
Ich hatte es schon einmal versucht nc$geometry <- NULL, aber Ihr Vorschlag hat es geschafft. Danke.
Eivindhammers
Gibt es eine Pipe-Version davon? sf %>% mutate(geometry = NULL)funktioniert nicht
obrl_soil
2
Vielleicht heißt es "Geom" und nicht "Geometrie"? (Es wird niemals konstant sein). Ein anderer Weg ist `x%>% st_set_geometry (NULL)`. Beides ist möglicherweise in dev enthalten, nicht in CRAN, obwohl ich nicht sorgfältig überprüfe, wo ich mich vor Ort befinde.
mdsumner
@mdsumner macht einen großen, indirekten Punkt. Jemand muss die Methode tatsächlich schreiben, es passiert nicht durch Zauberei. Da sf eine neue Objektklasse in R ist, sind viele Methoden möglicherweise nicht verfügbar oder verhalten sich nicht wie erwartet.
Jeffrey Evans
34

Hier ist ein Pipeline-Ansatz, um ein sf-Objekt in einen einfachen Datenrahmen ohne Geometrie umzuwandeln. Verwenden Sie die st_set_geometry()Funktion:

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"

BEARBEITEN

Am 2018.11.16 , st_drop_geometry()wurde sf, zugegeben , die dies ausdrücklich tut:

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

Oder nur, df[,-geometry_column]wenn Sie kein neues Objekt erstellen möchten

Wo:

df - dein Objekt

geometry_column - Spalte, in der die Geometrie gespeichert ist

ami
quelle
Funktioniert nicht an meinem Ende. Hast du es getestet? Ich mache sf[, -sf$geometry]und bekommeError in Ops.sfc(grid.sf$geometry) : argument "e2" is missing, with no default
eivindhammers
Versuchen Sie sF [, - Geometrie] nicht sf [, - sf $ Geometrie]
ami
sf[, -geometry]scheitert mit Error in -"geometry" : invalid argument to unary operator. Reproduzieren Sie mitdata(meuse, package = "sp"); meuse_sf <- st_as_sf(meuse); meuse_sf[, -geometry]
eivindhammers
5
Dies funktioniert in keiner Weise. Vielleicht war es in einem früheren sfPaket so, aber jetzt nicht. Alle Teilmengen von sfDatenrahmen behalten die Geometriespalte bei. Bitte löschen.
Spacedman