在R语言中如何将坐标点与对应分类值匹配
解决SF随机点分类与坐标关联问题
需求回顾
在矩形(-6,-4)到(6,4)范围内生成250个随机点,位于指定方形区域内的点标记为蓝色,区域外标记为红色。最终需要将点坐标与分类值匹配:
- 第三列(蓝色标记):蓝色点记
+1,红色点记-1 - 第四列(红色标记):蓝色点记
-1,红色点记+1
修正后的完整代码
library(sf) library(sfheaders) # 生成边界矩形 border <- matrix(c( -6, -4, -6, 4, 6, 4, 6, -4, -6, -4 ), ncol = 2, byrow = TRUE) %>% sfheaders::sfc_polygon() # 生成目标方形区域并合并为单个多边形 squares1 <- matrix(c( -4, 0, -4, 3, -1, 3, -1, 0, -4, 0 ), ncol = 2, byrow = TRUE) %>% sfheaders::sfc_polygon() squares2 <- matrix(c( -2, -4, -2, -1, 1, -1, 1, -4, -2, -4 ), ncol = 2, byrow = TRUE) %>% sfheaders::sfc_polygon() squares3 <- matrix(c( 2, -2, 2, 1, 5, 1, 5, -2, 2, -2 ), ncol = 2, byrow = TRUE) %>% sfheaders::sfc_polygon() # 合并多个方形为单个区域(更高效的判断方式) target_area <- st_union(squares1, squares2, squares3) # 生成随机点 rand_points <- st_sample(border, size = 250) # 判断每个点是否在目标区域内(蓝色点) is_blue <- st_within(rand_points, target_area, sparse = FALSE)[,1] # 提取坐标并转换为数据框 coord_df <- as.data.frame(st_coordinates(rand_points)) colnames(coord_df) <- c("X", "Y") # 重命名坐标列 # 添加分类标记列 coord_df$blue_score <- ifelse(is_blue, 1, -1) coord_df$red_score <- ifelse(is_blue, -1, 1) # 查看结果(可选) head(coord_df) # 绘图验证(修正原代码变量名错误) plot(border) plot(rand_points[!is_blue], add = TRUE, col = "red") # 红色点(区域外) plot(rand_points[is_blue], add = TRUE, col = "blue") # 蓝色点(区域内)
关键步骤解释
- 合并目标区域:用
st_union将多个方形合并为单个多边形,后续判断点是否在区域内时更高效。 - 批量标记分类:用
st_within直接判断所有随机点是否在目标区域内,返回逻辑向量is_blue,避免分开存储红蓝点再合并的麻烦。 - 生成标记列:通过
ifelse根据is_blue的值生成要求的第三、第四列,直接关联坐标与分类。 - 修正绘图错误:原代码中使用了未定义的
negative_vals和positive_vals,改为用逻辑索引筛选红蓝点绘图。
结果说明
最终生成的coord_df数据框包含四列:
X/Y:点的坐标blue_score:蓝色分类标记(蓝点+1,红点-1)red_score:红色分类标记(蓝点-1,红点+1)
内容的提问来源于stack exchange,提问作者Prometheus
相关产品推荐
相关产品推荐

