You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 16:45:03