使用tidyverse/dplyr编写R函数时遇summarise方法错误求助
R函数报错:
summarise无适用方法的问题解决 错误信息
Error in UseMethod("summarise") :
no applicable method for 'summarise' applied to an object of class "c('double', 'numeric')"
问题分析
你的函数报错主要源于以下几个问题:
- 管道中断:原函数中
group_by语句后未用管道连接summarize,导致summarize未处理分组后的数据集,反而单独计算df$estimate - df$popval生成的数值向量,触发方法不匹配错误。 - 参数命名冲突:函数参数
term与数据框列名term重名,filter(df, term == term)逻辑等价于恒真,无法实现筛选行的目的。 - 列引用方式错误:函数内用
df$estimate的方式不符合dplyr管道的使用逻辑,且未用整洁评估处理传入的列参数。 - 调用参数错误:调用时传入的
df$b1不存在,且列参数传递方式不正确。
修正后的代码
修正后的函数
library(tidyverse) bias = function(df, term_val, estimate_col, popval_col){ df %>% filter(term == term_val) %>% group_by(n, col, source) %>% summarize(ab = round(mean(abs({{estimate_col}} - {{popval_col}})), 3), .groups = "drop") }
正确调用方式
# 生成测试数据(保留原数据结构) set.seed(457) mydata <- data.frame(id=1:6, y=sample(6), estimate=rnorm(6), n=c(200,500,200,500,500, 200), pop = c(.30, .30, .30, .30, .30, .30), col = c(.00, .00, .30, .30, .50, .50), term = factor(c('x1', 'x2', 'x1', 'x2', 'x1', 'x2')), source = c(1,2,3,4,1,2) ) # 调用函数 result = bias(mydata, term_val = "x1", estimate_col = estimate, popval_col = pop) print(result)
修正说明
- 参数重命名:将原参数
term改为term_val,明确其为筛选term列的具体值,避免与列名冲突。 - 连贯管道:用
%>%连接所有dplyr操作,确保数据在管道中正确传递。 - 整洁评估:用
{{ }}包裹传入的列参数,让函数正确识别数据框中的列,支持非标准求值。 - 修正调用参数:传入数据框中存在的
pop列(而非不存在的b1),并正确传递列名参数。 - 分组清理:添加
.groups = "drop"取消分组,避免返回分组数据框可能带来的后续操作问题。
运行修正后的代码,结果会和你正常运行的ab_b2完全一致。
内容的提问来源于stack exchange,提问作者George
相关产品推荐
相关产品推荐

