深入理解r-spatial/sf中的Tidyverse方法

深入理解r-spatial/sf中的Tidyverse方法

sf Simple Features for R sf 项目地址: https://gitcode.com/gh_mirrors/sf/sf

概述

在空间数据分析领域,r-spatial/sf包是R语言中处理地理空间数据的核心工具之一。本文重点介绍sf包中实现的Tidyverse方法,这些方法使得我们能够以一致、优雅的方式处理空间数据,同时保持几何属性的完整性。

Tidyverse与sf的集成

Tidyverse是一套R语言数据分析工具集,包括dplyr、tidyr等流行包。sf包为空间数据对象提供了这些Tidyverse方法的实现,使得我们能够:

  1. 使用熟悉的Tidyverse语法处理空间数据
  2. 自动保持几何列不被意外丢弃
  3. 在数据操作过程中维护空间关系

核心方法详解

数据筛选与排序

  • 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对象的一个关键特性是几何列的"粘性":

  1. 在大多数操作中,几何列会自动保留
  2. 如果需要移除几何列,需显式转换为普通数据框:as.data.frame()
  3. select()操作即使不选择几何列也会保留它

实用技巧

  1. 处理重复空间要素

    nc[c(1:100, 1:10), ] %>% distinct() %>% nrow()
    

    使用distinct.sf()时会同时比较属性和几何特征

  2. 创建空间线要素

    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)
    
  3. 处理分组几何: 在分组操作中,几何列会被自动处理,但要注意do_union参数的影响

注意事项

  1. 当多边形共享边界时,使用do_union=FALSE可能导致无效几何
  2. distinct.sf()使用st_equals进行几何比较,可通过exact参数控制精度
  3. 嵌套操作假设几何列是被嵌套的列之一

结语

r-spatial/sf中的Tidyverse方法为空间数据分析提供了强大而一致的接口。通过本文介绍的方法,您可以像处理普通数据框一样处理空间数据,同时保持空间关系的完整性。掌握这些方法将大大提高您的空间数据分析效率。

sf Simple Features for R sf 项目地址: https://gitcode.com/gh_mirrors/sf/sf

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

花淑云Nell

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值