如何用dplyr批量生成并合并pollster包的加权交叉表
用dplyr批量生成并合并加权交叉表
1. 加载依赖包与数据集
先导入所需工具包和示例数据集:
library(dplyr) library(pollster) library(purrr) library(tidyr) # 导入示例数据集 data(illinois)
2. 标准化单个交叉表生成函数
基于你的需求调整函数,返回带变量标识的长格式结果,方便后续批量合并:
create_crosstabs <- function(row_var, col_var, data, weight_var = "weight") { # 生成加权交叉表 ctab <- pollster::crosstab( data = data, x = !!sym(row_var), y = !!sym(col_var), weight = !!sym(weight_var), format = "long" ) # 添加变量名标识,重命名列让结构更清晰 ctab %>% mutate( row_variable = row_var, col_variable = col_var, .before = 1 ) %>% rename( row_category = x, col_category = y, weighted_pct = pct, unweighted_n = n ) }
3. 定义待迭代的变量列表
把需要生成交叉表的行、列变量分别列出来(示例替换成你实际的30个行变量和13个列变量):
# 行变量:sex、educ6、raceethnic等 row_vars <- c("sex", "educ6", "raceethnic") # 列变量:maritalstatus、rv、voter等 col_vars <- c("maritalstatus", "rv", "voter")
4. 批量生成并合并所有交叉表
通过变量组合迭代+批量调用函数,快速生成并合并所有结果:
# 生成所有行-列变量的组合 var_combinations <- cross_df(list(row_var = row_vars, col_var = col_vars)) # 批量生成交叉表并按行合并 all_crosstabs <- var_combinations %>% pmap_dfr(create_crosstabs, data = illinois)
5. 可选:按变量分组整理
如果需要按行/列变量拆分查看结果,可使用group_split:
# 按行变量拆分出独立表格列表 by_row_var <- all_crosstabs %>% group_split(row_variable, .keep = TRUE) # 按列变量拆分出独立表格列表 by_col_var <- all_crosstabs %>% group_split(col_variable, .keep = TRUE)
关键提示
- 用
!!sym()实现字符串变量名的引用,是dplyr处理动态变量的标准写法。 - 若你的权重列不是
weight,调用函数时可指定weight_var参数,比如pmap_dfr(create_crosstabs, data = illinois, weight_var = "your_weight_col")。 pollster::crosstab的format = "long"参数直接返回长格式,避免后续额外的格式转换操作。
内容的提问来源于stack exchange,提问作者Ella Wind
相关产品推荐
相关产品推荐

