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

如何用purrr的map2/imap实现对应GEOID分组列表的st_intersects映射?

批量匹配GEOID对应的点与多边形相交并添加状态字段

因为你的两个列表or_pts和or_counties都是按GEOID分组命名的,用purrr的map2或imap可以轻松实现批量对应匹配,具体方案如下:

方案1:用map2(适用于两个列表元素顺序完全对应)

如果or_pts和or_counties的元素顺序一一对应(即第n个元素的GEOID完全相同),直接用map2同时遍历两个列表的对应元素:

# 加载所需包
library(purrr)
library(sf)

# 批量处理每个GEOID的点与多边形
or_pts_with_status <- map2(or_pts, or_counties, function(pts_df, poly_df) {
  # 计算每个点是否在对应多边形内,返回逻辑向量
  is_inside <- st_intersects(pts_df, poly_df, sparse = FALSE)[, 1]
  # 添加status字段,将布尔值转为颜色
  pts_df$status <- ifelse(is_inside, "green", "red")
  # 返回处理后的点数据框
  pts_df
})

方案2:用imap(适用于列表元素名字为GEOID,顺序无关)

如果两个列表的元素顺序可能不一致,但列表元素的名字都是对应的GEOID,用imap更稳妥——它会自动传递每个元素的名字(即GEOID),直接匹配or_counties中对应名字的多边形:

# 加载所需包
library(purrr)
library(sf)

# 按GEOID名字匹配处理
or_pts_with_status <- imap(or_pts, function(pts_df, geoid) {
  # 根据GEOID取出对应的多边形数据框
  target_poly <- or_counties[[geoid]]
  # 计算点是否在多边形内
  is_inside <- st_intersects(pts_df, target_poly, sparse = FALSE)[, 1]
  # 添加颜色状态字段
  pts_df$status <- ifelse(is_inside, "green", "red")
  # 返回结果
  pts_df
})

关键说明

  • st_intersects设置sparse = FALSE会返回逻辑矩阵,因为每个or_counties的元素是单个县的多边形,所以取矩阵第一列即可得到每个点的相交结果。
  • 处理后的or_pts_with_status保留原列表的结构,每个元素都新增了status字段,可直接用于可视化(比如用ggplot2的color = status参数)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 18:04:50