Mengekstrak data.frame dari objek fitur sederhana di R

43

Apakah ada cara sf-asli (yaitu "benar") mengekstraksi segala sesuatu kecuali kolom geometri dari objek fitur sederhana? Ini bekerja

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

tapi select( , -geometry)langkah itu terasa tidak perlu. Juga, itu tidak menghapus atribut geometri.

eivindhammers
sumber
2
Juga dimungkinkan dengandf <- st_drop_geometry(df)
radek
@radek Juga dalam versi CRAN?
eivindhammers
Saya percaya begitu. Saat ini sedang 0.7-2menggunakan cran. Dan ini ada di sini rdocumentation.org/packages/sf/versions/0.7-2/topics/…
radek

Jawaban:

36

Setel st_geometryproperti ke 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"

Juga (meskipun ini tidak akan menghapus attr(nc, "sf_column"):

nc <-  st_read(system.file("shape/nc.shp", package="sf"), quiet = TRUE)
as.data.frame(nc)
mdsumner
sumber
Saya sudah mencoba nc$geometry <- NULLsebelumnya, tetapi saran Anda berhasil. Terima kasih.
eivindhammers
apakah ada versi pipa dari ini? sf %>% mutate(geometry = NULL)tidak berfungsi
obrl_soil
2
Mungkin itu disebut "geom" dan bukan "geometri"? (Tidak akan pernah konstan). Cara lain adalah `x%>% st_set_geometry (NULL)`. Salah satu dari ini mungkin dalam dev, bukan CRAN meskipun saya tidak memeriksa dengan hati-hati di mana saya berada di lokal.
mdsumner
@mdsumner membuat poin bagus, tidak langsung. Seseorang harus benar-benar menulis metodenya, itu tidak terjadi dengan sihir. Karena sf adalah kelas objek baru dalam R banyak metode mungkin tidak tersedia atau tidak berperilaku seperti yang diharapkan.
Jeffrey Evans
34

Berikut ini adalah pendekatan pipabel untuk mengubah objek sf menjadi bingkai data sederhana tanpa geometri. Gunakan st_set_geometry()fungsinya:

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"

EDIT

Pada 11/16/2018 , st_drop_geometry()ditambahkan ke sf, yang melakukan ini secara eksplisit:

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

Atau hanya df[,-geometry_column]jika Anda tidak ingin membuat objek baru

Dimana:

df - objek Anda

geometry_column - kolom tempat geometri disimpan

ami
sumber
Tidak bekerja pada saya. Sudahkah Anda mengujinya? Saya lakukan sf[, -sf$geometry]dan dapatkanError in Ops.sfc(grid.sf$geometry) : argument "e2" is missing, with no default
eivindhammers
Coba sF [, - geometri] bukan sf [, - sf $ geometry]
ami
sf[, -geometry]gagal dengan Error in -"geometry" : invalid argument to unary operator. Reproduksi dengandata(meuse, package = "sp"); meuse_sf <- st_as_sf(meuse); meuse_sf[, -geometry]
eivindhammers
5
Ini tidak bekerja dengan cara apa pun. Mungkin itu dilakukan dalam beberapa sfpaket sebelumnya , tetapi sekarang tidak. Semua subset dari sfframe data mempertahankan kolom geometri. Tolong hapus.
Spacedman