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

R语言中使用dplyr包mutate结合across与rowSums报'x' must be numeric错误的问题求助

问题分析与解决方案

你遇到的错误核心原因有两个:

  1. rowSums()的作用范围错误:你在mutate()里直接用rowSums(., na.rm = TRUE),这里的.指代的是经过select后的整个数据集——里面包含了resource_name和project这两个字符型列,rowSums()无法对字符型数据求和,自然会抛出'x' must be numeric的错误。
  2. across()的用法不符合你的需求:across()的作用是对多列执行相同的转换操作并返回这些列的集合,但你这里的目的是对选中的列按行求和,across()本身不会帮你完成行级的汇总。

接下来给你两种符合需求的解决方案,都能适配你“用contains("_20")动态选列”的要求:


方案1:直接用rowSums()结合select()筛选目标列

这个方法最简单直接,不需要额外的分组操作:

library(dplyr)

test <- tibble(resource_name = c("Justin", "Corey", "Justin"),
               project = c("P1", "P2", "P3"),
               sep_2021 = c(1, 2, NA),
               oct_2021 = c(5, 2, 1))

test %>% 
  select(resource_name, project, sep_2021, oct_2021) %>% 
  mutate(total = rowSums(select(., contains("_20")), na.rm = TRUE))

这里select(., contains("_20"))会先从当前数据集中提取所有包含_20的数值列,再传给rowSums()计算行总和,完美避开了非数值列的干扰。


方案2:用c_across()结合rowwise()实现行级求和

如果你更习惯用dplyr的行级操作语法,可以用rowwise()先按行分组,再用c_across()把选中的列转为行向量,最后用sum()计算总和:

test %>% 
  select(resource_name, project, sep_2021, oct_2021) %>% 
  rowwise() %>% 
  mutate(total = sum(c_across(contains("_20")), na.rm = TRUE)) %>% 
  ungroup()  # 记得取消行分组,避免后续操作受影响

c_across()的作用是在rowwise()分组下,把指定的列按行合并为一个向量,这样sum()就能对每一行的目标列求和了。


运行任意一种方案,你都会得到期望的输出:

# A tibble: 3 × 5
  resource_name project sep_2021 oct_2021 total
  <chr>         <chr>      <dbl>    <dbl> <dbl>
1 Justin        P1             1        5     6
2 Corey         P2             2        2     4
3 Justin        P3            NA        1     1

内容的提问来源于stack exchange,提问作者J.Sabree

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 13:54:07