简化同位素衰变类型分组的R代码实现方案咨询
优化方案:基于Tidyverse风格的核素衰变类型分组
针对你的需求,我们遵循H. Wickham倡导的DRY(Don't Repeat Yourself)原则和tidyverse编程范式,用更简洁的方式实现按最可能衰变类型分组的功能,彻底消除重复代码。
核心思路
- 将宽格式的衰变概率数据转换为长格式,避免对每种衰变类型编写重复逻辑
- 按核素分组,筛选出每个核素概率最高的衰变类型
- 基于筛选结果完成分组统计或后续分析
完整代码示例
假设你的数据集结构是:包含nuclide(核素标识)列,以及对应每种衰变类型的概率列(比如decay_2B-、decay_2EC、decay_P、decay_N等),代码如下:
library(tidyverse) # ------------------------------ # 模拟数据集(实际使用时替换为真实数据) # ------------------------------ set.seed(123) nuclide_data <- tibble( nuclide = paste0("Nuclide_", 1:100), `decay_2B-` = runif(100), `decay_2EC` = runif(100), `decay_P` = runif(100), `decay_N` = runif(100) ) # ------------------------------ # 转换格式并筛选每个核素的最可能衰变类型 # ------------------------------ nuclide_top_decay <- nuclide_data %>% # 把所有衰变类型列转为长格式:核素→衰变类型→概率 pivot_longer( cols = starts_with("decay_"), # 匹配所有以decay_开头的列,可根据实际列名调整规则 names_to = "decay_type", values_to = "probability", names_prefix = "decay_" # 移除列名前缀,得到纯衰变类型标识(如2B-、2EC) ) %>% # 按核素分组,筛选概率最大的行 group_by(nuclide) %>% # 处理并列最大值:如果需要只保留一个,添加with_ties = FALSE slice_max(probability, n = 1) %>% ungroup() # ------------------------------ # 按衰变类型分组(示例为统计每组核素数量) # ------------------------------ nuclide_grouped <- nuclide_top_decay %>% group_by(decay_type) %>% summarise(nuclide_count = n()) %>% ungroup()
优化点说明
- 消除重复代码:无论新增多少种衰变类型,只需确保列名符合规则,代码无需修改,彻底避免复制粘贴
- 优雅的筛选逻辑:用
slice_max替代手动的max判断,代码更易读且符合tidyverse规范 - 灵活扩展:如果需要处理并列最大值(一个核素多种衰变概率相同),只需调整
slice_max的with_ties参数即可
内容的提问来源于stack exchange,提问作者Logos
相关产品推荐
相关产品推荐

