Wyodrębnianie data.frame z obiektu prostych funkcji w języku R

43

Czy istnieje natywny (sf „poprawny”) sposób wyodrębnienia wszystkiego oprócz kolumny geometrii z prostego obiektu obiektów? To działa

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

ale select( , -geometry)krok wydaje się niepotrzebny. Ponadto nie usuwa atrybutów geometrii.

eivindhammers
źródło
2
Możliwe również zdf <- st_drop_geometry(df)
radek
@radek Również w wersji CRAN?
eivindhammers
Tak mi się podoba. Obecnie 0.7-2na Cran. I jest tutaj rdocumentation.org/packages/sf/versions/0.7-2/topics/…
radek

Odpowiedzi:

36

Ustaw st_geometrywłaściwość na 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"

Ponadto (choć nie spowoduje to usunięcia attr(nc, "sf_column"):

nc <-  st_read(system.file("shape/nc.shp", package="sf"), quiet = TRUE)
as.data.frame(nc)
mdsumner
źródło
Próbowałem już nc$geometry <- NULLwcześniej, ale twoja sugestia załatwiła sprawę. Dziękuję Ci.
eivindhammers
czy jest to wersja potokowa? sf %>% mutate(geometry = NULL)nie działa
obrl_soil 25.04.17
2
Może nazywa się to „geom”, a nie „geometria”? (To nigdy nie będzie stałe). Innym sposobem jest `x%>% st_set_geometry (NULL)`. Oba mogą być w fazie tworzenia, a nie CRAN, chociaż nie sprawdzam dokładnie, gdzie jestem lokalnie.
mdsumner,
@mdsumner stanowi świetny, pośredni punkt. Ktoś musi napisać metodę, nie dzieje się to za pomocą magii. Ponieważ sf jest nową klasą obiektów w R, wiele metod może być niedostępnych lub może nie działać zgodnie z oczekiwaniami.
Jeffrey Evans,
34

Oto podejście oparte na potoku do przekształcenia obiektu SF w prostą ramkę danych bez geometrii. Użyj st_set_geometry()funkcji:

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"

EDYTOWAĆ

W dniu 11/16/2018 , st_drop_geometry()dodano do SF, który robi to wyraźnie:

nc_df2 <- nc %>% st_drop_geometry()
class(nc_df2)
#> [1] "data.frame"
mfherman
źródło
-5
df <- df[,-geometry_column]

Lub po prostu, df[,-geometry_column]jeśli nie chcesz tworzyć nowego obiektu

Gdzie:

df - twój obiekt

geometry_column - kolumna, w której przechowywana jest geometria

ami
źródło
Po mojej stronie nie działa. Przetestowałeś to? Robię sf[, -sf$geometry]i Error in Ops.sfc(grid.sf$geometry) : argument "e2" is missing, with no default
biorę
Spróbuj sF [, - geometria] nie sf [, - sf $ geometria]
ami
sf[, -geometry]nie działa z Error in -"geometry" : invalid argument to unary operator. data(meuse, package = "sp"); meuse_sf <- st_as_sf(meuse); meuse_sf[, -geometry]
Rozmawiaj
5
To nie działa w żaden sposób. Może tak było w niektórych wcześniejszych sfpakietach, ale teraz już nie. Wszystkie podzbiory sframek danych zachowują kolumnę geometrii. Proszę usunąć.
Spacedman