如何用R统计两条曲线边界间及两侧的观测点数量?
解决思路与代码实现
步骤1:整理边界曲线数据
首先需要把两条边界曲线的x值按升序排列,确保后续插值逻辑准确:
# 排序上边界(data_line1)的x和y data_line1_sorted <- data_line1[order(data_line1$x), ] # 排序下边界(data_line2)的x和y data_line2_sorted <- data_line2[order(data_line2$x), ]
步骤2:为每个观测点插值对应边界的y值
使用approx()函数,根据观测点的x值,从排序后的边界曲线中插值得到对应位置的上边界y值和下边界y值:
# 插值得到每个观测点对应的上边界y值 data_dots$y_upper <- approx(data_line1_sorted$x, data_line1_sorted$y, xout = data_dots$x)$y # 插值得到每个观测点对应的下边界y值 data_dots$y_lower <- approx(data_line2_sorted$x, data_line2_sorted$y, xout = data_dots$x)$y
步骤3:分类统计观测点
通过观测点的y值与插值得到的上下边界y值比较,标记每个点的类别,再统计各类别数量:
# 添加类别标记 data_dots$category <- case_when( data_dots$y > data_dots$y_upper ~ "高于上边界", data_dots$y < data_dots$y_lower ~ "低于下边界", TRUE ~ "位于边界之间" ) # 统计各类别数量 count_result <- table(data_dots$category) print(count_result)
完整可运行代码
library(dplyr) library(ggplot2) # 生成原始数据 data_line1 <- data.frame(line = "1", x = c(0, round(runif(18,0,10), 2), 10), y = round(runif(20,40,60), 2)) data_line2 <- data.frame(line = "2", x = c(0, round(runif(18,0,10), 2), 10), y = round(runif(20,0,39), 2)) data_dots <- data.frame(x = round(runif(200,0,10), 2), y = round(runif(100,0,60), 2)) # 排序边界数据 data_line1_sorted <- data_line1[order(data_line1$x), ] data_line2_sorted <- data_line2[order(data_line2$x), ] # 插值获取对应边界y值 data_dots$y_upper <- approx(data_line1_sorted$x, data_line1_sorted$y, xout = data_dots$x)$y data_dots$y_lower <- approx(data_line2_sorted$x, data_line2_sorted$y, xout = data_dots$x)$y # 分类并统计 data_dots$category <- case_when( data_dots$y > data_dots$y_upper ~ "高于上边界", data_dots$y < data_dots$y_lower ~ "低于下边界", TRUE ~ "位于边界之间" ) count_result <- table(data_dots$category) print(count_result) # 可选:可视化分类结果 ggplot()+ geom_line(data = data_line1_sorted, aes(x,y), color = "black")+ geom_line(data = data_line2_sorted, aes(x,y), color = "red")+ geom_point(data = data_dots, aes(x,y, color = category))+ scale_color_manual(values = c("高于上边界" = "orange", "位于边界之间" = "deepskyblue", "低于下边界" = "green"))
补充说明
approx()默认使用线性插值,适配连续边界曲线场景;如果边界是非线性的,可以指定method = "spline"进行样条插值。case_when()来自dplyr包,用于清晰的多条件判断,需提前加载该包。
内容的提问来源于stack exchange,提问作者tipofey
相关产品推荐
相关产品推荐

