R语言如何从多列数据中选取得票最多的分类值生成新列
R实现多模型分类结果多数投票
针对每行取多个模型分类结果的众数(得票最高值)写入新列的需求,以下是可直接复用的实现方案:
方案1:dplyr 写法(可读性强,适合日常数据处理)
加载dplyr包后逐行计算频次,取最高频分类即可:
library(dplyr) # 将df替换为你的数据表名,model1/model2/model3替换为实际的模型结果列名 df <- df %>% rowwise() %>% mutate( final_class = names(which.max(table(c(model1, model2, model3)))) ) %>% ungroup()
小提示:如果你的分类标签是数值型(比如0/1二分类),可以在外面套一层as.numeric()转换回数值类型;如果是因子类型,套as.factor()即可保持原有类型。
方案2:base R 写法(无第三方包依赖)
不需要安装加载任何扩展包,用apply逐行计算即可,适合轻量场景:
# 方括号内填入三个模型结果对应的列名或者列索引 df$final_class <- apply(df[, c("model1", "model2", "model3")], 1, function(row) { names(which.max(table(row))) })
平票场景自定义处理
如果出现平票(比如3个模型给出3个不同结果、偶数个模型出现2:2票数),上述代码默认返回分类值排序第一的结果。如果需要自定义平票规则(比如平票时优先采纳第一个模型的结果、或者标记为"平票"待人工复核),可以封装单独的判断函数:
library(dplyr) vote_func <- function(res_vec) { freq_count <- table(res_vec) max_vote <- max(freq_count) candidate <- names(freq_count)[freq_count == max_vote] # 规则1:唯一最高票直接返回 if(length(candidate) == 1) return(candidate) # 规则2:平票时返回第一个模型的结果,可按需修改为其他逻辑 return(res_vec[1]) } df <- df %>% rowwise() %>% mutate(final_class = vote_func(c(model1, model2, model3))) %>% ungroup()
效果测试
用模拟数据验证逻辑:
# 构造测试数据集 test_df <- data.frame( sample_id = 1:4, model1 = c("A", "A", "B", "C"), model2 = c("A", "B", "B", "A"), model3 = c("A", "C", "A", "B") )
运行代码后得到的最终分类列完全匹配多数投票逻辑:
- 样本1:全票选A,结果为A
- 样本2:三个模型各投A/B/C,平票按规则取第一个模型的A
- 样本3:两个模型选B,结果为B
- 样本4:三个模型各投C/A/B,平票按规则取第一个模型的C
内容的提问来源于stack exchange,提问作者JLLavin
相关产品推荐
相关产品推荐

