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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 14:54:22