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
相关产品推荐
相关产品推荐

