如何在使用group_by和summarise后安全去除数据重复?
问题描述
首先定义数据框:
test_df <- tibble( Project = c("Project 1","Project 1","Project 2","Project 3","Project 3","Project 3"), Cost = c(100,50,400,50,75,150), `Percent Over Cost` = c(.25,.25,.14,.05,.05,.05) )
需求:按Project分组求和Cost,但不汇总Percent Over Cost,最终每个Project对应一行数据(共3行)。
尝试了以下代码,虽然实现了Cost求和,但Project仍重复:
test_df %>% group_by(Project) %>% summarise( Project, `Percent Over Cost`, Cost = sum(Cost) )
用unique()处理结果能得到预期效果,但不确定这是否是不良实践,想知道有没有更优实现方式。
解决方案
因为每个Project对应的Percent Over Cost值是唯一的(同一项目下该值没有差异),可以在summarise步骤直接提取该项目对应的唯一值,避免后续再用unique()处理,代码更简洁且逻辑清晰:
test_df %>% group_by(Project) %>% summarise( `Percent Over Cost` = first(`Percent Over Cost`), # 也可以用unique()或nth(1) Cost = sum(Cost) )
补充说明
这种写法比先生成重复行再去重更靠谱:
- 同一项目下
Percent Over Cost值相同时,first()、unique()都能拿到正确结果 - 要是哪天数据里某个项目的
Percent Over Cost出现不一致的情况,这种写法会直接暴露问题(比如unique()会返回多个值导致报错),而事后用unique()处理可能会悄悄掩盖这个数据异常,留下隐患。
内容的提问来源于stack exchange,提问作者Stephen Poole
相关产品推荐
相关产品推荐

