如何在survey包中使用tidy评估?函数调用报错求解
问题:调查数据批量计算均值、标准误和置信区间的函数报错
背景
我正在开发一个函数,用来重复计算调查数据的均值、标准误和置信区间,需要针对多个变量及不同过滤条件执行该操作。
数据
df <- data.frame(address_id = rep(c(1,1,1,2,2,2,3,3,3,4,4,4),5), person_id = rep(c(1,2,3),20), sex = as.factor(rep(c("male","female"),30)), response_var = as.factor(rep(seq(1,6,1))), weight = runif(60, 50, 200))
无函数时的可行示例
# 创建调查设计 design <- survey::svydesign(data = df, strata = ~ address_id, id = ~ person_id, nest = TRUE, weights = ~ weight) # 计算加权均值 mean_se <- survey::svymean(~sex, design) # 计算置信区间(注:原代码中df_mean为笔误,应为mean_se) ci <- survey::confint(mean_se)
我的函数及调用
create_mean_and_cis <- function(data, var){ design <- survey::svydesign(data = data, strata = ~ address_id, id = ~ person_id, nest = TRUE, weights = ~ weight) mean_se <- survey::svymean(~{{var}}, design) ci <- confint(mean_se)%>% tibble::as_tibble()%>% tibble::rownames_to_column("variable") output <- mean_se%>% tibble::as_tibble()%>% tibble::rownames_to_column("variable")%>% dplyr::left_join(ci) return(output) } # 函数调用 create_mean_and_cis(sex)
错误信息
Error in survey::svydesign(data = data, strata = ~address_id, id = ~person_id, : object 'sex' not found
问题分析与解决
报错核心原因是函数调用时未传入data参数:你只传了sex,但函数定义的第一个参数是data,R会把sex当成data参数的值,自然找不到这个对象。
另外补充几点细节调整:
- 修正函数调用,必须传入数据框和变量名:
create_mean_and_cis(df, sex) ~{{var}}的tidy评估语法本身是正确的,只要确保var是数据框内的变量名即可- 如果需要支持字符串形式的变量名(比如传入
"sex"),可以调整svymean的参数写法:
这样裸变量名和字符串变量名都能正常工作。mean_se <- survey::svymean(as.formula(paste0("~", rlang::as_name(rlang::ensym(var)))), design)
内容的提问来源于stack exchange,提问作者Colin Daglish
相关产品推荐
相关产品推荐

