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

R语言按数值差异≤10%分组拆分dataframe的tidy方案咨询

实现方案

核心逻辑:先将数据集按Total_read降序排列,从最大数值开始构建分组,要求组内所有数值与组内最大值的差值不超过10%(即数值 ≥ 组最大值 * 0.9),不符合要求则开启新分组,最后拆分成分组列表。

完整tidy风格代码

首先加载tidyverse套件:

library(tidyverse)

示例数据构造:

data1 <- data.frame(Symbol=c("APEX1","APOC3","CCNA2","CDC42","CDK1","BRCA2","BSCL2","BUB1B","EEF2","EFEMP1","EGF","ATP5O","ATR"), Total_read=c(32546,32426,31854,31745,25879,25465,24759,24574,8769,8458,2546,875,850))

分组处理代码:

result_list <- data1 %>%
  # 按Total_read降序排列,保证每个组第一个元素是组内最大值
  arrange(desc(Total_read)) %>%
  # 动态生成组号
  mutate(
    group_id = cumsum(
      # 第一个元素默认开新组,后续元素小于当前组最大值的90%则开新组
      row_number() == 1 | Total_read < lag(cummax(Total_read), default = first(Total_read)) * 0.9
    )
  ) %>%
  # 按组号拆分得到列表,丢弃辅助列group_id
  group_split(group_id, .keep = FALSE)

结果验证

输出result_list可得到完全符合预期的5个子集,各组均满足差值要求:

  • 第1组:Total_read范围31745~32546,组内最小值31745 ≥ 32546*0.9≈29291
  • 第2组:Total_read范围24574~25879,组内最小值24574 ≥ 25879*0.9≈23291
  • 第3组:Total_read范围8458~8769,组内最小值8458 ≥ 8769*0.9≈7892
  • 第4组:仅单元素2546,自然符合要求
  • 第5组:Total_read范围850~875,组内最小值850 ≥ 875*0.9=787.5

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 19:57:03