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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 09:35:32