R语言按school_code分组汇总数据出现重复行的问题排查
R语言分组聚合重复行问题排查与优化
问题根源
你的代码出现重复行有两个核心原因:
- 列名不匹配:原始数据列是
school和interview_status,但代码里误用了school_code和ma_interview_status,导致分组和过滤逻辑出现偏差(若你实际数据列名确实是school_code,则需统一修正列名)。 - 错误使用
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
相关产品推荐
相关产品推荐

