自定义tidyverse函数中dplyr::summarise()报错排查求助
问题解决:批量生成兽医站点统计表格的报错修复
错误原因
调用函数时用vars()包裹变量参数,但dplyr的{{}}(curly curly)语法期望接收裸变量名或单个quosure,vars()返回的是quosure列表,导致ifelse无法识别参数类型,触发报错。
修复步骤
1. 修改函数调用方式
去掉vars()包裹,直接传入裸变量名:
# 修正后的调用 df.vetsite1.2021 %>% make_vet_site_table_row(var1 = var1_final_denom, var2 = var2_for_cnt) df.vetsite2.2021 %>% make_vet_site_table_row(var1 = var1_beginning_denom, var2 = var2_for_cnt)
2. 优化函数内部逻辑(可选,更简洁健壮)
替换基础ifelse为dplyr::if_else(类型检查更严格),也可以用逻辑值乘法简化计算:
make_vet_site_table_row <- function(df, var1, var2) { df %>% dplyr::summarise( "Total number of vets" = n(), "Number of customers with at least 11 dogs" = sum(dplyr::if_else({{var1}} >= 11, {{var2}}, 0)), "Number of customers with at least 20 dogs" = sum(dplyr::if_else({{var1}} >= 20, {{var2}}, 0)), "Total number of dogs" = sum({{var1}}), "Mean number of patients (by vet)" = round(mean({{var1}}), digits = 2), "Range of the number of patients (by vet)" = max({{var1}}) - min({{var1}}), "Smallest and largest number of dogs (by vet)" = paste0(min({{var1}}), ", ", max({{var1}})) ) }
3. 验证结果
用示例数据集测试:
# 构造示例数据集 df.vetqm <- tibble::tibble( site = c("site1", "site2", "site2", "site2", "site3", "site3"), var1_final_denom = c(3, 66, 23, 45, 542, 68), var2_for_cnt = c(3, 65, 45, 48, 423, 63), year = rep("2021", 6) ) # 分组预处理 df.vetsite.2021 <- df.vetqm %>% filter(year=="2021" & var1_final_denom>0) %>% group_by(site) # 调用生成表格 df.vetsite.2021 %>% make_vet_site_table_row(var1 = var1_final_denom, var2 = var2_for_cnt)
输出结果会自动保留site分组列,符合期望格式:
| site | Total number of vets | Number of customers with at least 11 dogs | Number of customers with at least 20 dogs | Total number of dogs | Mean number of patients (by vet) | Range of the number of patients (by vet) | Smallest and largest number of dogs (by vet) |
|---|---|---|---|---|---|---|---|
| site1 | 1 | 0 | 0 | 3 | 3.00 | 0 | 3, 3 |
| site2 | 3 | 158 | 158 | 134 | 44.67 | 43 | 23, 66 |
| site3 | 2 | 486 | 486 | 610 | 305.00 | 474 | 68, 542 |
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

