为何R中dplyr的summarize函数无法正常运行?含示例报错
R语言dplyr summarise报错:Can't convert
fn, a double vector, to a function 问题场景
尝试用tidyverse的dplyr包计算分组描述统计,此前可正常运行的代码突然报错,业务代码和基于iris数据集的测试代码均触发相同错误。
业务代码
library(dplyr) df %>% dplyr::select(GROUP,VAR1, VAR2, VAR3, VAR4) %>% group_by(GROUP) %>% #subset(GROUP!="PUNG") %>% summarize(.cols = everything(), list(Mean=mean, Dev.st=sd))
测试示例代码
iris %>% group_by(Species) %>% summarise(across(starts_with("Sepal"), list(mean = mean, sd = sd)))
报错信息
Error in `summarize()`: ! Problem while computing `..1 = across(everything(), list(Mean = mean, Dev.st = sd))`. ℹ The error occurred in group 0: character(0). Caused by error in `as_across_fn_call()`: ! Can't convert `fn`, a double vector, to a function. Run `rlang::last_error()` to see where the error occurred.
问题原因与解决方法
核心原因
你的R环境中存在同名数值变量覆盖了内置的mean/sd函数。当代码调用mean/sd时,实际引用的是一个数值而非统计函数,导致across无法识别并报错。
排查步骤
验证是否存在同名变量:
exists("mean") exists("sd")若返回
TRUE,说明环境中存在覆盖内置函数的变量。查看变量内容:
mean # 若输出是数值而非函数体,即可确认问题 sd
解决方式
方式1:删除冲突变量
在控制台运行以下命令,清除覆盖函数的数值变量:
rm(mean, sd)
之后重新运行统计代码即可恢复正常。
方式2:明确指定函数命名空间
修改代码,调用函数时指定base包的命名空间,彻底避免变量冲突:
修改后的业务代码:
library(dplyr) df %>% dplyr::select(GROUP,VAR1, VAR2, VAR3, VAR4) %>% group_by(GROUP) %>% #subset(GROUP!="PUNG") %>% summarize(across(everything(), list(Mean=base::mean, Dev.st=base::sd)))修改后的测试示例代码:
iris %>% group_by(Species) %>% summarise(across(starts_with("Sepal"), list(mean = base::mean, sd = base::sd)))
为什么之前能运行?
此前你的R环境中不存在mean/sd同名变量,后续可能因误操作(比如运行了mean <- 5这类赋值代码)创建了冲突变量,导致函数被覆盖触发报错。
内容的提问来源于stack exchange,提问作者Manuel Tiburtini
相关产品推荐
相关产品推荐

