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.


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)

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"

-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


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.