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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 18:01:03