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

R语言按列分组获取每组最常见因子的高效实现方法

高效获取分组后因子列的众数

针对你需要按列a分组、提取每组中因子b最常见值的需求,以下是几种高效的解决方案,比自定义mode函数性能更优:

方案1:dplyr + count + slice_max

利用dplyr的分组计数和取最大值操作,底层经过优化,适合大多数场景:

library(tidyverse)

# 示例数据
df <- tibble(a = c(1,1,1,2,2,2), b = factor(c('cat', 'dog', 'cat', 'cat', 'dog', 'dog')))

df %>%
  # 按a、b分组统计频次
  count(a, b, name = "freq") %>%
  # 每组取频次最高的行
  slice_max(n = 1, order_by = freq, .by = a) %>%
  # 保留需要的列
  select(a, b)

输出结果:

ab
1cat
2dog

方案2:data.table(超大数据集首选)

data.table的操作在处理百万级以上数据时速度优势明显:

library(data.table)

setDT(df)
df[, .N, by = .(a, b)][, .SD[which.max(N)], by = a][, -"N"]

逻辑是先按a和b计数,再每组筛选计数最大的行,最后移除计数列。

方案3:dplyr + forcats::fct_count

针对因子类型的列,forcats包的fct_count可以直接统计因子水平的频次并排序,代码更简洁:

library(forcats)

df %>%
  reframe(
    # 取频次最高的第一个因子水平
    b = fct_count(b, sort = TRUE)[[1]][1],
    .by = a
  )

为什么自定义mode函数效率低?

自定义mode函数通常依赖循环、apply系列函数或者逐组遍历,这类操作属于非向量化处理,在数据量较大时,远不如dplyr、data.table的底层向量化优化操作高效。

内容的提问来源于stack exchange,提问作者at.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 05:47:14