如何用dplyr::mutate返回各组占比最大值并重复填充?
解决dplyr中组内性别占比最大值填充到每行的问题
原始数据集
set.seed(51) df_1 <- data.frame( nomes = LETTERS[1:100], filtro1 = sample(x = c("sim", "não"), size = 100, replace = TRUE), filtro2 = sample(x = c("sim", "não"), size = 100, replace = TRUE), genero = sample(x = c("masculino", "feminino"), size = 100, replace = TRUE), groups = sample(x = 1:3, size = 100, replace = TRUE) )
原代码:获取各组内性别占比最大值记录
以下代码可得到每个groups中占比最高的性别及其占比:
library(dplyr) df_1 %>% group_by(groups, genero) %>% summarise(count = n()) %>% mutate(percent = count/sum(count)) %>% filter(count == max(count))
运行结果:
# Groups: groups [3] groups genero count percent <int> <chr> <int> <dbl> 1 1 feminino 16 0.533 2 2 masculino 19 0.633 3 3 masculino 21 0.525
需求与问题
需要将上述每组的占比最大值(及对应性别)填充到原数据集df_1的对应组每一行中,但直接把summarise替换为mutate无法实现目标——summarise会聚合分组行数,而原逻辑下用mutate无法正确提取组内全局的最大占比信息。
正确实现方法
方法一:先统计再关联
先单独计算每组的占比最大值及对应性别,再通过左连接将信息合并到原数据集的每一行:
# 1. 生成每组的占比最大值统计结果 group_stats <- df_1 %>% group_by(groups, genero) %>% summarise(count = n(), .groups = "drop_last") %>% mutate(percent = count / sum(count)) %>% filter(percent == max(percent)) %>% select(groups, dominant_genero = genero, max_percent = percent) # 2. 关联到原数据集,填充每行 df_1_with_max <- df_1 %>% left_join(group_stats, by = "groups")
方法二:单管道+窗口函数
无需单独生成统计表,用窗口函数在一次管道操作中完成:
df_1_with_max <- df_1 %>% group_by(groups, genero) %>% mutate(count = n()) %>% group_by(groups) %>% mutate( percent = count / sum(count), max_percent = max(percent), dominant_genero = genero[which.max(percent)] ) %>% ungroup()
结果说明
运行后,df_1_with_max会新增max_percent(该组性别占比最大值)和dominant_genero(该组占比最高的性别)两列,每个组的所有行都会填充对应的值。例如查看前几行:
head(df_1_with_max)
输出示例(部分):
nomes filtro1 filtro2 genero groups count percent max_percent dominant_genero 1 A sim não masculino 3 21 0.525 0.525 masculino 2 B não não feminino 1 16 0.533 0.533 feminino 3 C sim sim masculino 2 19 0.633 0.633 masculino
内容的提问来源于stack exchange,提问作者neves
相关产品推荐
相关产品推荐

