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)
输出结果:
| a | b |
|---|---|
| 1 | cat |
| 2 | dog |
方案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.
相关产品推荐
相关产品推荐

