You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何筛选sf表格中几何与多属性近似匹配的行?

解决方案步骤

假设你的两个sf表格分别名为sf_gbif(第一个数据源)和sf_local(第二个数据源),以下是具体实现步骤:

1. 加载依赖库

首先确保安装并加载sf和dplyr:

library(sf)
library(dplyr)

2. 标准化数据格式

统一日期格式

第一个表格的日期是带时间的字符串,需要转换为纯日期类型:

# 处理第一个表格的日期
sf_gbif$date <- as.Date(sf_gbif$date)
# 确保第二个表格的日期也是Date类型
sf_local$date <- as.Date(sf_local$date)

统一物种名称格式

消除大小写差异导致的匹配失败:

sf_gbif$species <- tolower(sf_gbif$species)
sf_local$species <- tolower(sf_local$species)

确认坐标系一致

两个表格必须使用相同的坐标系才能进行空间匹配:

# 将第一个表格的坐标系对齐到第二个表格
sf_gbif <- st_set_crs(sf_gbif, st_crs(sf_local))

3. 空间匹配与筛选

使用空间连接找到距离相近(例如10米内)的点,再筛选出日期、物种匹配但作者不同的记录:

# 空间连接:找10米范围内的匹配点(可根据实际需求调整距离)
matched_points <- st_join(
  sf_gbif, 
  sf_local, 
  join = st_is_within_distance, 
  dist = 10,
  suffix = c("_gbif", "_local")
)

# 筛选符合条件的记录:日期相同、物种相同、作者不同
filtered <- matched_points %>%
  filter(
    date_gbif == date_local,
    species_gbif == species_local,
    author_gbif != author_local
  )

4. 整理输出结果

提取两个表格中符合条件的行并合并:

# 提取第一个表格的匹配行
gbif_subset <- filtered %>%
  select(
    date = date_gbif,
    species = species_gbif,
    author = author_gbif,
    Id,
    name,
    geometry = geometry_gbif
  )

# 提取第二个表格的匹配行
local_subset <- filtered %>%
  select(
    date = date_local,
    species = species_local,
    author = author_local,
    Id,
    name,
    geometry = geometry_local
  )

# 合并结果
final_result <- bind_rows(gbif_subset, local_subset)

# 可选:按日期和物种排序
final_result <- final_result %>% arrange(date, species)

说明

  • 距离阈值dist=10可根据你的数据精度调整(比如如果是GPS点,5-20米都是合理范围)。
  • 如果需要精确的点重合匹配,可将st_is_within_distance替换为st_equals。
  • 标准化物种名称时,也可以使用stringr::str_squish去除多余空格,避免格式差异。

内容的提问来源于stack exchange,提问作者UlvHare

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 08:43:09