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

R语言按school_code分组汇总数据出现重复行的问题排查

R语言分组聚合重复行问题排查与优化

问题根源

你的代码出现重复行有两个核心原因:

  1. 列名不匹配:原始数据列是school和interview_status,但代码里误用了school_code和ma_interview_status,导致分组和过滤逻辑出现偏差(若你实际数据列名确实是school_code,则需统一修正列名)。
  2. 错误使用mutate:mutate是给每行新增列,不会压缩分组后的行数——分组后每个学校有多少原始行,就会生成多少条带num_row和percent的记录;后续summarise因为引用了每行都存在的字段,不会执行聚合操作,直接保留了所有行,最终导致重复。

此外你的占比计算逻辑也存在问题:分组后sum(num_row)是当前分组内所有num_row的总和(比如school1分组里num_row都是2,总和就是4),得到的percent并非你想要的有效占比。

修正后的代码

场景1:占比为「该校完成数占所有完成数的比例」

对应你期望输出中school1的2 (50)逻辑(总完成数4,该校完成2,占比50%):

interviews_completed <- study_progress_raw %>%
  # 过滤已完成访谈
  filter(interview_status == 1) %>% 
  # 按学校分组
  group_by(school) %>%
  # 计算每个学校的完成数
  summarise(num_completed = n()) %>%
  # 计算占比并拼接格式
  mutate(
    percent = (num_completed / sum(num_completed)) * 100,
    Interviews_Completed = paste0(num_completed, " (", percent, ")")
  ) %>%
  # 保留需要的列
  select(school, Interviews_Completed)

场景2:占比为「该校完成数占该校总样本数的比例」

对应你期望输出中school10/15的1 (100)逻辑(该校所有样本均完成):

interviews_completed <- study_progress_raw %>%
  group_by(school) %>%
  # 同时计算完成数和该校总样本数
  summarise(
    num_completed = sum(interview_status == 1),
    total_samples = n()
  ) %>%
  mutate(
    percent = (num_completed / total_samples) * 100,
    Interviews_Completed = paste0(num_completed, " (", percent, ")")
  ) %>%
  select(school, Interviews_Completed)

更简便的实现方法

用count一步完成分组计数,搭配glue包拼接格式更直观:

# 场景1简化版
interviews_completed <- study_progress_raw %>%
  filter(interview_status == 1) %>%
  count(school, name = "num_completed") %>%
  mutate(
    percent = (num_completed / sum(num_completed)) * 100,
    Interviews_Completed = glue::glue("{num_completed} ({percent})")
  ) %>%
  select(school, Interviews_Completed)

若需要整数格式的占比,可添加round(percent, 0)或as.integer(percent)处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 05:33:09