R语言中按指定分组对DataFrame应用自定义函数报错的原因与解决
按指定列汇总dist字段的报错问题解决
问题背景
你有如下结构的DataFrame:
dist id daytime season 3 1.11 Name1 day summer 4 2.22 Name2 night spring 5 3.33 Name1 day winter 6 4.44 Name3 night fall
希望按特定列对dist字段做汇总统计,编写了自定义函数:
summary <- function(x){df %>% group_by(x) %>% summarize(min = min(dist), q1 = quantile(dist, 0.25), median = median(dist), mean = mean(dist), q3 = quantile(dist, 0.75), max = max(dist))}
调用summary_ID <- summary(id)时出现报错:
Error in `group_by()`: ! Must group by variables found in `.data`. ✖ Column `x` is not found.
报错原因
这个报错是dplyr非标准求值规则导致的:
- 当你调用
summary(id)时,函数内部的group_by(x)并没有把x解析成你传入的列名id,而是把x当成一个字面列名去数据框中查找,自然找不到名为x的列,因此报错。 - 之前能成功大概率是使用了旧版本dplyr,旧版本对非标准求值的限制较宽松;新版本dplyr(1.0.0及以后)要求明确使用整洁评估语法来传递列名变量。
解决方法
方法一:用整洁评估大括号注入列名
修改函数,在group_by中用{{x}}语法注入传入的列名,这是最简洁的方式:
summary <- function(x){ df %>% group_by({{x}}) %>% summarize(min = min(dist), q1 = quantile(dist, 0.25), median = median(dist), mean = mean(dist), q3 = quantile(dist, 0.75), max = max(dist)) }
调用方式不变:summary_ID <- summary(id)
方法二:传入列名字符串并解析
如果习惯传字符串形式的列名(比如summary("id")),可以用sym()将字符串转为符号,再用!!注入:
summary <- function(x){ df %>% group_by(!!sym(x)) %>% summarize(min = min(dist), q1 = quantile(dist, 0.25), median = median(dist), mean = mean(dist), q3 = quantile(dist, 0.75), max = max(dist)) }
调用时改为:summary_ID <- summary("id")
额外优化建议
你的函数直接依赖全局变量df,建议把数据框也作为参数传入,让函数更通用、规范:
summary <- function(data, x){ data %>% group_by({{x}}) %>% summarize(min = min(dist), q1 = quantile(dist, 0.25), median = median(dist), mean = mean(dist), q3 = quantile(dist, 0.75), max = max(dist)) }
调用方式:summary_ID <- summary(df, id)
内容的提问来源于stack exchange,提问作者eldritchmayo
相关产品推荐
相关产品推荐

