如何在R的svyby中用lapply遍历因变量与自变量列表并合并结果?
解决survey包中遍历多因变量与多分组变量计算均值的问题
问题背景
原本的代码通过lapply遍历多个因变量,按group1+iv1分组,使用svyby计算加权均值和置信区间。现在需要扩展为同时遍历多个分组变量(即分别按group1+iv1、group1+iv2分组),合并所有结果到一个数据框,但尝试的嵌套lapply代码报错:
Error in class(ff) <- "formula" : attempt to set an attribute on NULL
错误原因分析
- 公式构造错误:内层
svyby的第一个参数错误地使用了分组变量k而非因变量x;同时by参数写成~ as.formula(...)是多余的,as.formula已经返回公式对象,不需要前面加~ - 嵌套列表处理不当:双层
lapply会生成列表的列表,直接bind_rows无法正确解析
修正后的代码
library(survey) library(tidyverse) # 构建调查设计(保持原逻辑) dem_design <- svydesign( ids = ~1, data = na.omit(dplyr::select(data, dv1, dv2, group1, iv1, iv2)) ) dv_variables = c("dv1","dv2") iv_variables = c("iv1","iv2") # 双层遍历因变量和分组变量,处理后合并 df <- lapply(dv_variables, function(x) { lapply(iv_variables, function(k) { # 正确构造因变量公式和分组公式 svyby( formula = as.formula(paste0("~", x)), by = as.formula(paste0("~group1 + ", k)), design = dem_design, FUN = svymean, keep.names = FALSE, vartype = "ci" ) %>% # 新增列标记当前使用的分组变量,避免混淆 mutate(iv_var = k) }) }) %>% # 先展开嵌套列表为一维列表 flatten() %>% bind_rows() %>% # 整理列名,提取因变量和均值 pivot_longer( cols = matches("dv\\d"), # 匹配因变量列 names_to = "dv", values_to = "mean", values_drop_na = TRUE )
关键修正点
- 公式构造:
svyby的formula参数对应因变量x,by参数正确构造group1 + 分组变量k的公式 - 嵌套列表展开:用
flatten()把双层列表转为一维列表,确保bind_rows能正确合并所有子数据框 - 分组变量标记:新增
iv_var列记录当前使用的分组变量,避免后续混淆不同分组的结果
内容的提问来源于stack exchange,提问作者flâneur
相关产品推荐
相关产品推荐

