R语言按行计算众数:并列/无众数场景取Method1值
问题原因
原有自定义众数函数存在两处逻辑缺陷:
- 对频数统计结果排序时,同频数值会按数值大小升序排列,默认返回排序后第一位的更小值,导致并列最高频场景返回结果不符合要求
- 未对「所有值无重复、不存在有效众数」的场景做兼容,直接返回NA,未按要求取Method1列值兜底
修正代码
只需要修改ModeFunc的判断逻辑,两种异常场景(无重复值、多值并列最高频)直接取传入向量的第一个元素(行向计算时传入向量的第一位就是Method1的取值),仅当存在唯一最高频值时返回真实众数:
database <- structure(list(Alternatives = c(3, 4, 5, 6, 7, 8, 9, 10, 11, 12), Method1 = c(1L, 10L, 7L, 8L, 9L, 6L, 5L, 3L, 4L, 2L), Method2 = c(1L, 8L, 6L, 7L, 10L, 9L, 4L, 2L, 5L, 3L), Method3 = c(1L, 10L, 7L, 8L, 9L, 6L, 4L, 2L, 3L, 5L), Method4 = c(1L, 9L, 6L, 7L, 10L, 8L, 5L, 3L, 2L, 4L)), class = "data.frame", row.names = c(NA, 10L)) ModeFunc <- function(Vec) { freq_tab <- table(Vec) max_freq <- max(freq_tab) # 提取所有最高频的候选值 valid_modes <- as.numeric(names(freq_tab[freq_tab == max_freq])) # 异常场景兜底:无重复值/多值并列,返回第一个元素(即Method1值) if (max_freq == 1 | length(valid_modes) > 1) { return(Vec[1]) } # 正常场景返回唯一众数 return(valid_modes[1]) } output <- database |> rowwise() |> mutate(Mode = ModeFunc(c_across(Method1:Method4))) |> data.frame()
运行结果
执行后输出完全匹配预期:
Alternatives Method1 Method2 Method3 Method4 Mode 1 3 1 1 1 1 1 2 4 10 8 10 9 10 3 5 7 6 7 6 7 4 6 8 7 8 7 8 5 7 9 10 9 10 9 6 8 6 9 6 8 6 7 9 5 4 4 5 5 8 10 3 2 2 3 3 9 11 4 5 3 2 4 10 12 2 3 5 4 2
内容的提问来源于stack exchange,提问作者Antonio
相关产品推荐
相关产品推荐

