使用R语言dplyr按TIME分组计算GROUP的SCORE总和问题
解决按TIME分组计算SCORE总和并扩展数据框的问题
原始数据
DATA = data.frame(GROUP = c(1,2,1,2,1,2), TIME = c(1,1,2,2,3,3), SCORE = c(0,7,9,8,3,4))
目标数据
WANT = data.frame(GROUP = c(1,2,3,1,2,3,1,2,3), TIME = c(1,1,1,2,2,2,3,3,3), SCORE = c(0,7,7,9,8,17,3,4,7))
需求说明
对每个TIME值,计算该时间点下所有GROUP的SCORE之和,并将这个总和作为GROUP=3的行,添加到对应TIME的分组中。
错误代码问题分析
你尝试的代码存在三处问题:
- 同时使用
group_by(TIME)和rowwise()会冲突,rowwise()会强制按行执行操作,破坏分组求和的逻辑 mutate(3' = sum())存在语法错误,列名的引号不匹配,且sum()`未指定要求和的目标列- 完全没处理添加
GROUP=3新行的逻辑
正确解决方案
方法一:分步实现(清晰易懂)
library(dplyr) # 1. 计算每个TIME的SCORE总和,生成GROUP=3的行 sum_rows <- DATA %>% group_by(TIME) %>% summarise(SCORE = sum(SCORE), .groups = "drop") %>% mutate(GROUP = 3) # 2. 合并原始数据与总和行,按TIME、GROUP排序得到目标结果 WANT <- bind_rows(DATA, sum_rows) %>% arrange(TIME, GROUP)
方法二:单管道操作(简洁高效)
library(dplyr) library(tibble) WANT <- DATA %>% group_by(TIME) %>% group_modify(~ bind_rows(.x, tibble(GROUP = 3, SCORE = sum(.x$SCORE)))) %>% ungroup() %>% arrange(TIME, GROUP)
运行上述任意代码,得到的WANT数据框与目标要求完全一致。
内容的提问来源于stack exchange,提问作者bvowe
相关产品推荐
相关产品推荐

