使用dplyr的group_by计算分组求和时的问题及解决方法
按月份和人员分组求和错误的原因与解决办法
原始数据
数据框mydata内容如下:
Date.created team_member TaskTime 2022/08 Karina 0.33 2022/08 Jelena 0.33 2022/08 Elina 0.67 2022/08 Jelena 0.67 2022/08 Karina 0.33 2022/07 Jelena 0.33 2022/07 Jelena 0.33 2022/07 Karina 0.67 2022/07 Elina 0.33 2022/07 Elina 0.67
期望结果
需要按月份和人员分组计算TaskTime的总和,期望输出:
2022/08 Karina 0.66 2022/08 Jelena 1 2022/08 Elina 0.67 2022/07 Jelena 0.66 2022/07 Karina 0.67 2022/07 Elina 1
尝试的错误代码
library(dplyr) mydata2 <- mydata %>% group_by(mydata$Date.created, mydata$team_member) %>% summarise(TaskTime=sum(mydata$TaskTime))
运行后得到的是整个数据框TaskTime的全局总和(4.66),而非分组求和结果。
问题原因
- 在
dplyr的管道操作中,使用mydata$列名会直接引用原始数据框的完整列,而非管道传递过来的分组后的数据子集。 - 虽然
group_by(mydata$Date.created, mydata$team_member)能生成分组标识,但后续summarise中的sum(mydata$TaskTime)会忽略分组限制,直接计算整个原始数据的总和,导致每个分组都返回相同的全局值。
解决方法
在dplyr管道流中,直接使用列名即可,无需添加数据框前缀:
library(dplyr) mydata2 <- mydata %>% group_by(Date.created, team_member) %>% summarise(TaskTime = sum(TaskTime), .groups = "drop")
- 说明:
group_by(Date.created, team_member)会基于当前管道中的数据进行分组,正确识别每个月份+人员的组合。sum(TaskTime)会针对每个分组内的TaskTime值求和,得到预期的分组结果。.groups = "drop"参数用于在求和后取消分组状态,返回常规的数据框格式;如果需要保留分组结构,可以省略该参数。
内容的提问来源于stack exchange,提问作者Диана
相关产品推荐
相关产品推荐

