Извлечение data.frame из объекта простых функций в R

44

Существует ли sf-нативный (то есть «правильный») способ извлечения всего, кроме столбца геометрии, из простого объекта объектов? Это работает

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

но select( , -geometry)шаг кажется ненужным. Кроме того, он не удаляет атрибуты геометрии.

eivindhammers
источник
2
Также возможно сdf <- st_drop_geometry(df)
radek
@radek Также в версии CRAN?
eivindhammers
Я верю в это. В данный момент 0.7-2на кране. И это здесь rdocumentation.org/packages/sf/versions/0.7-2/topics/…
radek

Ответы:

36

Установите st_geometryсвойство в 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"

Также (хотя это не удалит attr(nc, "sf_column"):

nc <-  st_read(system.file("shape/nc.shp", package="sf"), quiet = TRUE)
as.data.frame(nc)
mdsumner
источник
Я пытался nc$geometry <- NULLраньше, но ваше предложение сработало. Спасибо.
Эйвиндхаммерс
есть ли версия этого? sf %>% mutate(geometry = NULL)не работает
obrl_soil
2
Может быть, это называется "геом", а не "геометрия"? (Это никогда не будет постоянным). Другой способ - `x%>% st_set_geometry (NULL)`. Любой из них может быть в dev, а не в CRAN, хотя я не проверяю, где я нахожусь.
mdsumner
@mdsumner замечательно, косвенно. Кто-то должен на самом деле написать метод, это не происходит по волшебству. Так как sf - это новый объектный класс в R, многие методы могут быть недоступны или работать не так, как ожидалось.
Джеффри Эванс
35

Вот конвейерный подход для преобразования sf-объекта в простой фрейм данных без геометрии. Используйте st_set_geometry()функцию:

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"

РЕДАКТИРОВАТЬ

На 11/16/2018 , st_drop_geometry()был добавлен в НФ, который делает это в явном виде:

nc_df2 <- nc %>% st_drop_geometry()
class(nc_df2)
#> [1] "data.frame"
mfherman
источник
-5
df <- df[,-geometry_column]

Или просто df[,-geometry_column]если вы не хотите создавать новый объект

Где:

df - твой объект

geometry_column - столбец, в котором хранится геометрия

Ами
источник
Не работает на моем конце. Вы проверяли это? Я делаю sf[, -sf$geometry]и получаюError in Ops.sfc(grid.sf$geometry) : argument "e2" is missing, with no default
eivindhammers
Попробуйте sF [, - geometry], а не sf [, - sf $ geometry]
ami
sf[, -geometry]не в состоянии с Error in -"geometry" : invalid argument to unary operator. Воспроизвести сdata(meuse, package = "sp"); meuse_sf <- st_as_sf(meuse); meuse_sf[, -geometry]
eivindhammers
5
Это никак не работает. Может быть, это было в какой-то более ранней sfупаковке, но теперь это не так Все подмножества sfфреймов данных сохраняют столбец геометрии. Пожалуйста, удалите.
Spacedman