使用dplyr聚合时保留指定列的问题求助(R语言)
解决R中分组聚合时保留对应列的问题
我懂你的需求啦——分组后既要算出c的最大值和总和,还要保留c取最大值时对应的b值;如果同一组里有多个相同的最大c,就得挑b更大的那个。之前用summarise只拿到聚合结果却丢了对应b的问题,咱们用dplyr就能轻松解决,试试下面的方法:
方法一:用slice_max精准筛选目标行
先看你的原始数据:
df <- data.frame(a=rep(c("a","b"),each=2),b=c(500,400,200,300), c = c(5,10,2,4),stringsAsFactors = FALSE)
直接运行这段代码就能得到想要的结果:
library(dplyr) df %>% group_by(a) %>% # 先计算每组c的总和,新增sum_c列 mutate(sum_c = sum(c)) %>% # 按c降序、b降序排序,取每组第一行(满足c最大,c相同则b最大) slice_max(order_by = c(c, b), n = 1) %>% # 重命名列名让结果更清晰 rename(max_c = c) %>% # 调整列的顺序 select(a, max_c, sum_c, b) %>% ungroup()
运行后得到的结果:
# A tibble: 2 × 4 a max_c sum_c b <chr> <dbl> <dbl> <dbl> 1 a 10 15 400 2 b 4 6 300
测试特殊场景
针对你提到的c值相同的情况,比如这个测试数据:
df_special <- data.frame(a = rep("a",2), b = c(500,400), c = c(5,5), stringsAsFactors = FALSE)
用同样的代码处理,就能得到b=500的预期结果:
# A tibble: 1 × 4 a max_c sum_c b <chr> <dbl> <dbl> <dbl> 1 a 5 10 500
方法二:用arrange+slice实现
如果你更习惯排序后取行的思路,也可以这么写:
df %>% group_by(a) %>% mutate(sum_c = sum(c)) %>% # 组内先按c降序,再按b降序排列 arrange(desc(c), desc(b), .by_group = TRUE) %>% # 取每组的第一行 slice(1) %>% rename(max_c = c) %>% select(a, max_c, sum_c, b) %>% ungroup()
这个方法和slice_max的效果完全一致,只是用排序+取首行的逻辑实现,看你个人习惯选择就行。
内容的提问来源于stack exchange,提问作者Zizou
相关产品推荐
相关产品推荐

