如何在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
相关产品推荐
相关产品推荐

