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

