在dplyr中使用mutate(across)计算多列百分比遇异常求助
问题解决:使用
mutate(across)计算列百分比时得到100%的原因及修复 错误原因
你的数据在创建后处于group_by(fruit)的分组状态,当用across调用sum(.x)时,这个求和是针对每个fruit分组内的当前列计算的。但每个分组里John、Jacob、Total各自只有1个值,所以sum(.x)就等于当前值本身,最终计算结果自然是100%。
解决方案
要计算整列的百分比,需要先取消数据的分组状态,再执行across的计算逻辑。
修复后的代码
# 先取消分组,再计算各列占列总和的百分比(保留两位小数) fruiteaten <- test %>% ungroup() %>% mutate(across(c(John, Jacob, Total), ~ round((.x / sum(.x)) * 100, 2))) # 输出结果 # A tibble: 3 × 4 fruit John Jacob Total <chr> <dbl> <dbl> <dbl> 1 Apples 2.08 31.2 9.09 2 Pears 27.1 56.2 33.3 3 Bananas 70.8 12.5 57.6
如果需要保留分组(比如后续还有其他分组操作),也可以明确指定使用全局的列总和进行计算:
fruiteaten <- test %>% mutate(across(c(John, Jacob, Total), ~ round((.x / sum(.data[[cur_column()]], na.rm = TRUE)) * 100, 2)))
注:你的期望输出数值看起来是未乘以100的比例值,如果不需要转换为百分比,去掉*100即可。
内容的提问来源于stack exchange,提问作者Mary Rachel
相关产品推荐
相关产品推荐

