R语言提取dataframe各列前三最小值及对应Type值的实现方法
R代码实现:分组提取最小Top3记录并按交替格式输出
以下代码无额外包依赖,基础R环境即可运行,直接替换输入数据框即可复用:
# 1. 构造测试数据(使用时替换为你自己的蛋白组表达数据框即可) set.seed(123) raw_df <- data.frame( Type = paste0("Protein_", LETTERS[1:20]), Group1 = rnorm(20, mean = 10, sd = 2), Group2 = rnorm(20, mean = 12, sd = 3), Group3 = rnorm(20, mean = 8, sd = 1.5), Group4 = rnorm(20, mean = 15, sd = 4) ) # 2. 核心处理逻辑 # 定义要处理的分组列名,若你的列名有差异直接修改该向量即可 target_groups <- c("Group1", "Group2", "Group3", "Group4") extract_topn <- 3 # 提取最小的前N条,可按需修改 group_result <- lapply(target_groups, function(col_name){ # 按当前分组数值升序排列,提取前N条的Type和分组值 sub_df <- raw_df[order(raw_df[[col_name]], decreasing = FALSE), ][1:extract_topn, c("Type", col_name)] # 重命名列,方便后续合并 colnames(sub_df) <- c(paste0(col_name, "_Type"), col_name) # 新增排名字段用于横向拼接 sub_df$rank_id <- 1:extract_topn return(sub_df) }) # 横向合并所有分组结果,调整为Type、数值列交替的顺序 final_output <- Reduce(function(x,y) merge(x, y, by = "rank_id"), group_result) col_order <- as.vector(rbind(paste0(target_groups, "_Type"), target_groups)) final_output <- final_output[, col_order]
代码说明
- 输入数据要求:数据框必须包含存储标识的
Type列,以及对应分组的数值列,若分组列命名和示例不一致,仅需修改target_groups向量内的列名即可。 - 输出结果固定为N行(默认3行),列顺序严格按照「分组1_Type、分组1数值、分组2_Type、分组2数值……」的交替规则排列,完全匹配要求的格式。
- 平局处理:如果分组内存在数值完全相同的记录,默认按原始数据的行号顺序取数;需要自定义平局规则时,可在
order()函数内追加排序字段,例如order(raw_df[[col_name]], raw_df$Type, decreasing = FALSE)即可在数值相同时按Type字段的字典序排序。
测试运行上述代码得到的输出结构示意:
Group1_Type Group1 Group2_Type Group2 Group3_Type Group3 Group4_Type Group4 Protein_T 6.33023 Protein_R 6.853957 Protein_R 5.77528 Protein_D 7.220815 Protein_H 7.30628 Protein_O 7.690627 Protein_K 6.54416 Protein_S 9.018406 Protein_K 7.55848 Protein_M 8.579491 Protein_D 6.59424 Protein_P 10.21323
内容的提问来源于stack exchange,提问作者KABILAN
相关产品推荐
相关产品推荐

