R语言按行求和问题:计算各学校总分时mutate与rowSums报错
解决按行计算学校总分的问题
看起来你在计算各学校的科目总分时遇到了两个常见小问题:用sum()在mutate里得不到每行的结果,用rowSums()又碰到了类型报错。我来帮你一步步理清并解决:
问题诊断
为什么
sum()在mutate里不生效?
你原来的代码mutate(total_score = sum(Math_score,Eng_score,Science_score)),在默认的dplyr逻辑里,sum()会把这三列的所有数值加起来得到一个全局总和,而不是每行的三个分数相加。所以最终所有行的total_score都会显示同一个数,这显然不是你想要的每行总分。为什么
rowSums()报错'x' must be numeric?
这个错误说明你选中的列不是数值类型——大概率是导入数据时,这些分数列被误识别成了字符型,或者数据里混入了非数值内容。先确认列类型是解决这个问题的核心。
解决方案
方法1:用rowSums()(推荐,运行效率更高)
先确保目标列是数值型,再用rowSums()计算每行的和:
# 先检查列类型(可选步骤) str(scores_final) # 如果列不是数值型,先转换类型 scores_final <- scores_final %>% mutate(across(c(Math_score, Eng_score, Science_score), as.numeric)) # 计算每行总分 scores_final <- scores_final %>% mutate(total_score = rowSums(select(., Math_score, Eng_score, Science_score), na.rm = TRUE))
select(., ...)用来精准指定需要求和的列;na.rm = TRUE可以自动忽略缺失值(如果你的数据集里存在的话)。
方法2:用rowwise() + sum()
如果你更习惯用sum()函数,可以用rowwise()让dplyr切换为按行处理模式:
scores_final <- scores_final %>% rowwise() %>% mutate(total_score = sum(Math_score, Eng_score, Science_score, na.rm = TRUE)) %>% ungroup() # 记得取消按行分组,避免影响后续的列操作
示例验证
用你提供的数据集测试一下:
# 构造你的数据集 scores_final <- tibble( school = c("abc", "def", "ghi"), no_of_test_takers = c(4, 20, 33), Math_score = c(34, 44, 45), Eng_score = c(22, 55, 67), Science_score = c(33, 77, 44) ) # 用方法1计算总分 scores_final <- scores_final %>% mutate(total_score = rowSums(select(., Math_score, Eng_score, Science_score)))
最终会得到符合预期的结果:
| school | no_of_test_takers | Math_score | Eng_score | Science_score | total_score |
|---|---|---|---|---|---|
| abc | 4 | 34 | 22 | 33 | 89 |
| def | 20 | 44 | 55 | 77 | 176 |
| ghi | 33 | 45 | 67 | 44 | 156 |
内容的提问来源于stack exchange,提问作者th_cy
相关产品推荐
相关产品推荐

