You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言按行求和问题:计算各学校总分时mutate与rowSums报错

解决按行计算学校总分的问题

看起来你在计算各学校的科目总分时遇到了两个常见小问题:用sum()在mutate里得不到每行的结果,用rowSums()又碰到了类型报错。我来帮你一步步理清并解决:

问题诊断

  1. 为什么sum()在mutate里不生效?
    你原来的代码mutate(total_score = sum(Math_score,Eng_score,Science_score)),在默认的dplyr逻辑里,sum()会把这三列的所有数值加起来得到一个全局总和,而不是每行的三个分数相加。所以最终所有行的total_score都会显示同一个数,这显然不是你想要的每行总分。

  2. 为什么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)))

最终会得到符合预期的结果:

schoolno_of_test_takersMath_scoreEng_scoreScience_scoretotal_score
abc434223389
def20445577176
ghi33456744156

内容的提问来源于stack exchange,提问作者th_cy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:38:13