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

如何在R中基于指定delta值对数据框的数值进行分组?

在R中基于指定delta值对数值进行分组

问题背景

我有一个名为df的数据框:

value
1    2.0
2    2.0
3    5.0
4    1.0
5    2.1
6    3.0
7    3.1
8    2.9
9    4.0
10   4.2

对应的dput代码:

df <- structure(list(value = c(2, 2, 5, 1, 2.1, 3, 3.1, 2.9, 4, 4.2
)), class = "data.frame", row.names = c(NA, -10L))

需要基于delta=0.1对数值分组:

  • 2.0、2.0、2.1归为一组(差值≤0.1);
  • 3.0、3.1、2.9归为一组(彼此间差值均≤0.1,通过中间值连通);
  • 4.0和4.2分属不同组(差值0.2>0.1);
  • 孤立值(1.0、5.0)各自为一组。

期望输出示例:

value group
1    2.0     1
2    2.0     1
3    5.0     2
4    1.0     3
5    2.1     1
6    3.0     4
7    3.1     4
8    2.9     4
9    4.0     5
10   4.2     6

解决方案

方法一:基础R实现(无需额外包)

核心思路:先排序,通过判断相邻值的差值是否超过delta来划分连续分组,再映射回原数据。

# 设定delta值
delta <- 0.1

# 对数据框按value排序,保留原始结构
df_sorted <- df[order(df$value), , drop = FALSE]

# 生成分组标识:当当前值与前一个值的差>delta时,新建分组
group_ids <- cumsum(c(TRUE, diff(df_sorted$value) > delta))

# 将分组标识映射回原数据框
df$group <- group_ids[match(df$value, df_sorted$value)]

# (可选)处理浮点精度问题:若存在浮点误差,先对数值四舍五入
# df$rounded_value <- round(df$value, 1)
# df_sorted$rounded_value <- round(df_sorted$value, 1)
# df$group <- group_ids[match(df$rounded_value, df_sorted$rounded_value)]

# 查看结果
df

方法二:使用igraph包处理连通分组

适合更复杂的连通场景(比如非连续但通过多个中间值连通的情况),通过构建图的连通分量来分组。

library(igraph)

delta <- 0.1

# 提取唯一值,构建所有可能的数值对
unique_vals <- unique(df$value)
val_pairs <- expand.grid(v1 = unique_vals, v2 = unique_vals)

# 筛选出差值≤delta的边(排除自环)
edges <- val_pairs[abs(val_pairs$v1 - val_pairs$v2) <= delta & val_pairs$v1 != val_pairs$v2, ]

# 创建无向图并计算连通分量
graph <- graph_from_data_frame(edges, directed = FALSE)
comp <- components(graph)

# 将分组映射回原数据框
df$group <- comp$membership[as.character(df$value)]

# (可选)将分组编号重新整理为连续整数
df$group <- match(df$group, unique(df$group))

# 查看结果
df

说明

  • 浮点精度:若数值存在浮点存储误差(如2.1实际存储为2.1000000001),建议先对数值进行四舍五入(如round(df$value, 1))再分组,避免误判。
  • 分组编号:两种方法生成的分组编号顺序可能与示例不同,但核心逻辑一致——同一组的数值会被分配相同的标识。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 08:45:32