如何筛选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
相关产品推荐
相关产品推荐

