Extraindo data.frame do objeto de recursos simples em R

43

Existe uma maneira nativa sf (isto é, "correta") de extrair tudo, exceto a coluna geometria, de um objeto de recursos simples? Isso funciona

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

mas o select( , -geometry)passo parece desnecessário. Além disso, ele não remove os atributos de geometria.

eivindhammers
fonte
2
Também é possível comdf <- st_drop_geometry(df)
radek
@radek Também na versão CRAN?
eivindhammers 10/01
Eu acho que sim. Atualmente 0.7-2no cran. E é aqui rdocumentation.org/packages/sf/versions/0.7-2/topics/…
radek

Respostas:

36

Defina a st_geometrypropriedade como 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"

Além disso (embora isso não remova o attr(nc, "sf_column"):

nc <-  st_read(system.file("shape/nc.shp", package="sf"), quiet = TRUE)
as.data.frame(nc)
mdsumner
fonte
Eu tinha tentado nc$geometry <- NULLantes, mas sua sugestão fez o truque. Obrigado.
precisa saber é o seguinte
existe uma versão canalizada disso? sf %>% mutate(geometry = NULL)não funciona
obrl_soil
2
Talvez seja chamado "geom" e não "geometria"? (Isso nunca será constante). Outra maneira é `x%>% st_set_geometry (NULL)`. Qualquer um deles pode estar em desenvolvimento, não em CRAN, embora eu não esteja verificando cuidadosamente onde estou localmente.
Mdsumner # 25/17
O @mdsumner faz uma ótima observação indireta. Alguém tem que escrever o método, isso não acontece por mágica. Como sf é uma nova classe de objeto em R, muitos métodos podem não estar disponíveis ou não se comportar conforme o esperado.
Jeffrey Evans
34

Aqui está uma abordagem pipeable para transformar um objeto sf em um quadro de dados simples, sem geometria. Use a st_set_geometry()função:

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"

EDITAR

Em 16/11/2018 , st_drop_geometry()foi adicionado ao sf, que faz isso explicitamente:

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

Ou apenas df[,-geometry_column]se você não quiser criar um novo objeto

Onde:

df - seu objeto

geometry_column - coluna onde a geometria está armazenada

ami
fonte
Não funciona do meu lado. Você já testou? Eu faço sf[, -sf$geometry]e receboError in Ops.sfc(grid.sf$geometry) : argument "e2" is missing, with no default
eivindhammers
Tente sF [, - geometria] não sf [, - sf $ geometria]
ami
sf[, -geometry]falha com Error in -"geometry" : invalid argument to unary operator. Reproduzir comdata(meuse, package = "sp"); meuse_sf <- st_as_sf(meuse); meuse_sf[, -geometry]
eivindhammers
5
Isso não funciona de forma alguma. Talvez tenha feito em algum sfpacote anterior , mas agora não. Todo o subconjunto de sfquadros de dados preserva a coluna de geometria. Por favor delete.
Spacedman