R语言sf包处理GeoJSON数据时如何按指定年份筛选删除行?
问题根源
- 你误用了
sf包的st_filter()函数:该函数是空间筛选工具,核心逻辑是基于空间几何关系(如相交、包含)保留和第二个sf对象存在空间匹配的记录,并不是用来按属性字段筛选行的。 - 你当前代码的实际执行逻辑是:先筛选出2018-2021年的事故点,再保留所有和这些事故点空间位置重叠的记录——这就会把其他年份、但事发位置和目标年份事故位置一致的记录也保留下来,就是你看到非目标年份记录残留的原因。
正确实现方案
sf数据框完全兼容tidyverse的属性操作,你要做的属性筛选直接用dplyr的filter()函数即可:
library(sf) library(dplyr) crashes <- st_read("Crash_Analysis_System_(CAS)_data.geojson") # 直接按年份属性筛选,无需调用st_filter crashes <- crashes %>% # 若crashYear为数值型,直接写数值即可;若为字符串类型可保留引号 filter(crashYear %in% c(2018, 2019, 2020, 2021))
结果验证
筛选完成后可执行以下代码确认年份范围符合要求:
# 查看筛选后所有存在的年份 unique(crashes$crashYear) # 统计各年份的记录数量 table(crashes$crashYear)
内容的提问来源于stack exchange,提问作者scumbagsurfer
相关产品推荐
相关产品推荐

