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

在R中使用across()函数对多列求和时出现错误求助

问题分析与解决

数据与原代码

测试数据

Distance <-  data.frame(
 DAY    = c("1", "2","3")
,TEMP   = c(25, 27, 26.5)
,C1Dist01    = c(1, 1, 1)
,C2Dist01    = c(1, 1, 0)
,C3Dist01   = c(1, 0,0)
,C4Dist01   = c(1, 0, 0)
)

原求和代码

SumDistance<-Distance %>%
  rowwise() %>%
  mutate(CowSum = sum(across(select(ends_with("Dist01"))), na.rm = T))

错误信息

Error in across():
! Must only be used inside data-masking verbs like mutate(),
filter(), and group_by().
Backtrace:

  1. Distance %>% rowwise() %>% ...
  2. plyr::mutate(...)
  3. base::eval(cols[[col]], .data, parent.frame())
  4. base::eval(cols[[col]], .data, parent.frame())
  5. dplyr::across(select(ends_with("Dist01")))

错误原因

从回溯信息第2行可以看到,代码实际调用的是plyr::mutate而非dplyr::mutate。across是dplyr专属函数,仅支持在dplyr的数据掩码动词(如dplyr::mutate)中使用,而plyr版本的mutate完全不兼容该函数。

出现该问题的核心是你的环境中同时加载了plyr和dplyr包,且plyr的加载顺序晚于dplyr,导致mutate被plyr的版本覆盖;或是之前运行时dplyr的mutate优先级更高,现在环境发生了变化。

解决方法

方法1:明确指定dplyr::mutate

直接在代码中指定使用dplyr的mutate,同时简化across的写法(无需嵌套select):

SumDistance<-Distance %>%
  rowwise() %>%
  dplyr::mutate(CowSum = sum(across(ends_with("Dist01")), na.rm = TRUE))

方法2:移除plyr包的加载

如果不需要使用plyr包,直接卸载它避免命名空间冲突:

detach("package:plyr", unload = TRUE)

之后运行简化后的原代码即可:

SumDistance<-Distance %>%
  rowwise() %>%
  mutate(CowSum = sum(across(ends_with("Dist01")), na.rm = TRUE))

方法3:用rowSums替代(更高效)

行求和不需要依赖rowwise分组,直接用rowSums性能更优:

SumDistance <- Distance %>%
  mutate(CowSum = rowSums(select(., ends_with("Dist01")), na.rm = TRUE))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 19:55:04