深入理解r-spatial/sf中的Tidyverse方法
sf Simple Features for R 项目地址: https://gitcode.com/gh_mirrors/sf/sf
概述
在空间数据分析领域,r-spatial/sf包是R语言中处理地理空间数据的核心工具之一。本文重点介绍sf包中实现的Tidyverse方法,这些方法使得我们能够以一致、优雅的方式处理空间数据,同时保持几何属性的完整性。
Tidyverse与sf的集成
Tidyverse是一套R语言数据分析工具集,包括dplyr、tidyr等流行包。sf包为空间数据对象提供了这些Tidyverse方法的实现,使得我们能够:
- 使用熟悉的Tidyverse语法处理空间数据
- 自动保持几何列不被意外丢弃
- 在数据操作过程中维护空间关系
核心方法详解
数据筛选与排序
filter.sf()
: 基于条件筛选空间要素arrange.sf()
: 按指定列排序空间数据slice.sf()
: 按位置选择行
library(sf)
library(dplyr)
nc <- read_sf(system.file("shape/nc.shp", package="sf"))
# 筛选面积大于0.1的县
nc %>% filter(AREA > 0.1) %>% plot()
# 按面积排序并选择前10个最小的县
nc %>%
select(AREA) %>%
arrange(AREA) %>%
slice(1:10) %>%
plot(col = 'grey')
数据变形
mutate.sf()
: 添加或修改列transmute.sf()
: 创建新数据框并保留几何列select.sf()
: 选择列(始终保留几何列)
# 创建新列
nc2 <- nc %>% mutate(area10 = AREA/10)
# 选择特定列(几何列自动保留)
nc %>% select(SID74, SID79) %>% names()
分组与汇总
group_by.sf()
: 对空间数据进行分组summarise.sf()
: 分组汇总,处理几何列
# 按面积分组并计算平均面积
nc$area_cl <- cut(nc$AREA, c(0, .1, .12, .15, .25))
nc.g <- nc %>% group_by(area_cl)
nc.g %>% summarise(mean_area = mean(AREA)) %>% plot()
summarise.sf()
有两个重要参数:
do_union
: 控制是否使用st_union
合并几何(默认为TRUE)is_coverage
: 是否为多边形覆盖层优化算法
数据连接
sf实现了多种连接操作,保持几何列的完整性:
inner_join.sf()
left_join.sf()
right_join.sf()
full_join.sf()
semi_join.sf()
anti_join.sf()
数据重塑
gather.sf()
/pivot_longer.sf()
: 宽表转长表spread.sf()
/pivot_wider.sf()
: 长表转宽表nest.sf()
/unnest.sf()
: 嵌套与解嵌套
library(tidyr)
# 宽转长示例
nc %>%
select(SID74, SID79, geometry) %>%
pivot_longer(cols = c(SID74, SID79), names_to = "VAR", values_to = "SID")
几何列的粘性特性
sf对象的一个关键特性是几何列的"粘性":
- 在大多数操作中,几何列会自动保留
- 如果需要移除几何列,需显式转换为普通数据框:
as.data.frame()
select()
操作即使不选择几何列也会保留它
实用技巧
-
处理重复空间要素:
nc[c(1:100, 1:10), ] %>% distinct() %>% nrow()
使用
distinct.sf()
时会同时比较属性和几何特征 -
创建空间线要素:
storms.sf <- st_as_sf(storms, coords = c("long", "lat"), crs = 4326) x <- storms.sf %>% group_by(name, year) %>% nest trs <- lapply(x$data, function(tr) st_cast(st_combine(tr), "LINESTRING")[[1]]) %>% st_sfc(crs = 4326) trs.sf <- st_sf(x[,1:2], trs)
-
处理分组几何: 在分组操作中,几何列会被自动处理,但要注意
do_union
参数的影响
注意事项
- 当多边形共享边界时,使用
do_union=FALSE
可能导致无效几何 distinct.sf()
使用st_equals
进行几何比较,可通过exact
参数控制精度- 嵌套操作假设几何列是被嵌套的列之一
结语
r-spatial/sf中的Tidyverse方法为空间数据分析提供了强大而一致的接口。通过本文介绍的方法,您可以像处理普通数据框一样处理空间数据,同时保持空间关系的完整性。掌握这些方法将大大提高您的空间数据分析效率。
sf Simple Features for R 项目地址: https://gitcode.com/gh_mirrors/sf/sf
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考