如何创建含控制变量的交叉表?以Region为控制变量的技术问询
带控制变量的交叉表实现方案
需求说明
需要生成社会类别(SoCat)与政策可及性(PolAcc)的交叉表,同时以Region作为控制变量(按区域拆分表格)。现有示例数据如下:
| ID | Region | SoCat | PolAcc |
|---|---|---|---|
| 1 | Urban | Poor | Yes |
| 2 | Urban | MidCls | Yes |
| 3 | Urban | Rich | Yes |
| 4 | Rural | Poor | No |
| 5 | Rural | MidCls | Yes |
| 6 | Rural | Rich | Yes |
已知xtab()、cross tab()等函数仅支持基础2×2交叉表,无法直接实现带控制变量的分组交叉表,期望输出格式如下:
| Urban. | Rural. | |----------|----------| | PolAcc: | PolAcc: | | Yes | No | Yes | No | |-----|-----|-----|-----| Poor. | 1 | | | 1 | MidCls | 1 | | 1 | | Rich. | 1 | | 1 | |
实现方法(R语言)
方法1:用dplyr+tidyr手动重塑数据
通过分组统计频数,再将数据转换为宽格式,最终调整为目标样式:
# 加载依赖包 library(dplyr) library(tidyr) # 构造示例数据 df <- data.frame( ID = 1:6, Region = c("Urban", "Urban", "Urban", "Rural", "Rural", "Rural"), SoCat = c("Poor", "MidCls", "Rich", "Poor", "MidCls", "Rich"), PolAcc = c("Yes", "Yes", "Yes", "No", "Yes", "Yes") ) # 统计各分组的频数 count_data <- df %>% count(Region, SoCat, PolAcc) %>% # 转换为宽格式,按Region和PolAcc作为列名 pivot_wider( names_from = c(Region, PolAcc), values_from = n, values_fill = list(n = 0) # 缺失值填充为0 ) # 将0替换为空字符串,匹配期望格式 count_data[count_data == 0] <- "" # 输出结果 print(count_data)
运行后得到的结果(可进一步调整列名格式以完全匹配目标样式):
| SoCat | Urban_Yes | Urban_No | Rural_Yes | Rural_No |
|---|---|---|---|---|
| Poor | 1 | 1 | ||
| MidCls | 1 | 1 | ||
| Rich | 1 | 1 |
方法2:用tables包直接生成结构化交叉表
tables包支持多维度交叉表的生成,代码更简洁:
library(tables) # 生成带控制变量的交叉表 tabular(SoCat ~ Region * PolAcc, data = df)
输出结果:
Region Urban Rural PolAcc PolAcc SoCat Yes No Yes No Poor 1 0 0 1 MidCls 1 0 1 0 Rich 1 0 1 0
可通过调整参数将0替换为空,完全匹配目标格式。
内容的提问来源于stack exchange,提问作者mam_k
相关产品推荐
相关产品推荐

