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

如何在R的group_by/summarize流程中提取因子变量的众值

如何在tidyverse的group_by/summarize工作流中提取因子变量的众值

作为R新手,用tidyverse/RStudio时,要在group_by+summarize流程里保留分类/因子变量,核心是需要一个能返回每组因子**最常见水平(众值)**的汇总函数。之前试的mean()返回NA、median()只支持数值型、summary()返回的是各水平计数而非众值,都达不到需求。

示例场景

用mtcars数据集子集,先把carb转为因子变量:

  • 4缸车:2辆carb=2、1辆carb=1
  • 6缸车:3辆carb=4、1辆carb=1
  • 8缸车:多模态情况暂不重点考虑

期望执行data %>% group_by(cyl) %>% summarise(modalcarb = FUNC(carb))后得到:

cyl carb 
<dbl> <fct>
4    2    
6    4    
8    2  

解决方法

方法1:自定义众值函数

写一个专门处理因子的众值函数,直接在summarize里调用:

# 定义提取因子众值的函数
get_mode <- function(x) {
  freq <- table(x)
  # 找出出现次数最多的水平,多模态时返回第一个
  mode_val <- names(freq)[freq == max(freq)] %>% head(1)
  # 保持原因子的水平属性
  factor(mode_val, levels = levels(x))
}

# 调用示例
library(tidyverse)

# 处理数据并提取众值
result <- mtcars %>%
  mutate(carb = factor(carb)) %>%
  group_by(cyl) %>%
  summarise(modalcarb = get_mode(carb))

# 查看结果
result

方法2:用tidyverse原生 verbs 实现

不用写额外函数,靠分组计数+筛选完成:

library(tidyverse)

result <- mtcars %>%
  mutate(carb = factor(carb)) %>%
  # 按cyl和carb分组计数
  group_by(cyl, carb) %>%
  count(name = "count") %>%
  # 在每个cyl组里取计数最高的carb(with_ties=FALSE避免多模态返回多行)
  slice_max(count, n = 1, with_ties = FALSE) %>%
  ungroup() %>%
  # 整理列名
  select(cyl, modalcarb = carb)

# 查看结果
result

说明

  • 多模态情况(多个水平出现次数相同):两种方法默认返回第一个出现的众值,可根据需求调整(比如返回所有众值,只需修改head(1)为保留全部,或去掉with_ties=FALSE)
  • 两种方法都会保留carb的因子类型,符合你保留分类变量的需求

内容的提问来源于stack exchange,提问作者TY Lim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 17:55:19