从R中的简单要素对象提取data.frame


43

有没有一种简单的(即“正确”)方法从简单要素对象中提取除几何列以外的所有内容?这有效

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

但此select( , -geometry)步骤感觉不必要。同样,它不会删除几何属性。


2
也可以df <- st_drop_geometry(df)
radek

@radek是否也在CRAN版本中?
eivindhammers

我是这样 目前0.7-2在公会上。而且它在这里rdocumentation.org/packages/sf/versions/0.7-2/topics/...
拉德克·

Answers:


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)

我以前尝试nc$geometry <- NULL过,但是您的建议成功了。谢谢。
eivindhammers

有管道版本吗?sf %>% mutate(geometry = NULL)不起作用
obrl_soil

2
也许它叫做“几何”而不是“几何”?(永远不会保持不变)。另一种方法是`x%>%st_set_geometry(NULL)`。尽管我没有仔细检查我在本地的位置,但是这些都可能是在dev中,而不是CRAN中。
mdsumner '17

@mdsumner提出了一个很好的,间接的观点。有人必须实际编写该方法,这不是靠魔术实现的。由于sf是R中的新对象类,因此许多方法可能不可用或无法按预期运行。
杰弗里·埃文斯

33

这是将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"

编辑

20181116日st_drop_geometry()已添加到sf,该操作明确执行了以下操作:

nc_df2 <- nc %>% st_drop_geometry()
class(nc_df2)
#> [1] "data.frame"

-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]
2017年

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.