R语言如何用reformulate为interaction传多个独立参数用于svymean
解决方案
核心问题修复
你原来的写法问题出在sprintf的格式占位符数量不匹配,同时存在变量名笔误,按以下方式修改即可实现独立传参:
1. 基础用法(对应简短问题)
要生成你需要的公式格式,直接在sprintf中设置两个占位符分别接收两个参数即可:
# 两个参数独立传入 var_col <- "Q50_1" filter_cond <- 'gender=="F"' # 外层用单引号避免内部双引号转义 # 生成目标公式 reformulate(sprintf("interaction(%s, %s)", var_col, filter_cond)) # 输出:~interaction(Q50_1, gender == "F")
2. 完整函数实现
修正后的create_df_new函数如下:
library(survey) library(readr) # 原数据和设计对象代码 data <- read_table2("Q50_1 Q50_2 Q38 Q90 pov gender wgt id yes 3 Yes NA High M 1.3 A NA 4 No 2 Med F 0.4 B no 2 NA 4 Low F 1.2 C maybe 3 No 2 High M 0.5 D yes NA No NA High M 0.7 E no 2 Yes 3 Low F 0.56 F maybe 4 Yes 2 Med F 0.9 G ") design <- svydesign(id =~id, weights = ~wgt, nest = FALSE, data = data) vars1 <- c("Q50_1", "Q38") # 修正后的新函数 create_df_new<- function(design, vector_vars, column){ myfun <- function(x){ # 修正sprintf占位符,分别传入列名和条件 form <- reformulate(sprintf('interaction(%s, %s)', x, column)) cbind(as.data.frame(svymean(form, design, na.rm = T))) } # 修正笔误:vector_of_vars改为传入的vector_vars final <- do.call(rbind, lapply(vector_vars, myfun)) return(final) } # 调用测试,条件外层用单引号包裹 create_df_new(design, vars1, 'gender=="F"')
3. 输出示例
运行后会得到按女性分组的交叉统计结果:
mean SE interaction(Q50_1, gender == "F")maybe.FALSE 0.5714286 0.2020305 interaction(Q50_1, gender == "F")no.FALSE 0.1428571 0.1322600 interaction(Q50_1, gender == "F")yes.FALSE 0.2857143 0.1707327 interaction(Q50_1, gender == "F")maybe.TRUE 0.2093023 0.1296730 interaction(Q50_1, gender == "F")no.TRUE 0.4093023 0.1713085 interaction(Q38, gender == "F")No.FALSE 0.5384615 0.1382568 interaction(Q38, gender == "F")Yes.FALSE 0.4615385 0.1382568 interaction(Q38, gender == "F")No.TRUE 0.2393162 0.1278654 interaction(Q38, gender == "F")Yes.TRUE 0.7606838 0.1278654
如果不需要展示gender==F为FALSE的分组,在调用svymean后过滤行名包含.TRUE的结果即可。
内容的提问来源于stack exchange,提问作者NewBee
相关产品推荐
相关产品推荐

