r - 从调查对象创建汇总统计数据的分层表(数据透视表)
问题描述
我无法通过 gtsummary::tbl_svysummary 创建具有子级别(两个层次的分层;嵌套)的汇总表。
我已经使用以下变量创建了对象调查::svydesign:性别、国家、结果、n(加权)。我设法创建了一个表,但是我无法按性别创建一个额外的层。我把我想要的表格结构放在下面。
我什至可以生成单独的表格(通过过滤器嵌套每个国家/地区)并将它们堆叠起来。但是,有21个国家,我想要一个更合理的策略。
请问各位有什么建议...
代码
# dataframe
df <-
data.frame(
Country = c("Country 1", "Country 2", "Country 3",
"Country 1", "Country 2", "Country 3",
"Country 1", "Country 2", "Country 3",
"Country 1", "Country 2", "Country 3"),
Result = c("A", "B", "C",
"B", "C", "A",
"C", "A", "B",
"A", "B", "C"),
Gender = c("M", "M", "M",
"W", "W", "W",
"M", "M", "M",
"W", "W", "W"),
n = c(583, 607, 1217,
487, 1100, 820,
178, 304, 367,
223,444,112))
df
# Create a weighted survey design object
df_survey <- survey::svydesign(~1,
data = df,
weights = ~n)
# Table
Table <- df_survey %>%
tbl_svysummary(by = Result,
percent = "row") %>%
add_overall(last = TRUE,
col_label = "**n(row)**") %>%
modify_header(label = "",
stat_by = "**{level}**") %>%
bold_labels() %>%
italicize_levels() %>%
italicize_labels()
Table
解决方案
这是一个让您非常接近您提供的模拟表的示例。您可以将输出转换为 flextableas_flex_table()
以使其更加相似。
library(tidyverse)
library(gtsummary)
df <-
tibble(
Country = c("Country 1", "Country 2", "Country 3",
"Country 1", "Country 2", "Country 3",
"Country 1", "Country 2", "Country 3",
"Country 1", "Country 2", "Country 3"),
Result = c("A", "B", "C",
"B", "C", "A",
"C", "A", "B",
"A", "B", "C"),
Gender = c("M", "M", "M",
"W", "W", "W",
"M", "M", "M",
"W", "W", "W"),
n = c(583, 607, 1217,
487, 1100, 820,
178, 304, 367,
223,444,112))
# Create a weighted survey design object
df_survey <- survey::svydesign(~1,
data = df,
weights = ~n)
df_results <-
tibble(Country = unique(df_survey$variables$Country)) %>%
rowwise() %>%
mutate(
# subset the design object within each country
design = df_survey[df_survey$variables$Country %in% Country, ] %>% list(),
# construct gtsummary table within each stratum
tbl =
design %>%
tbl_svysummary(by = Result,
percent = "row",
include = -Country) %>%
add_overall(last = TRUE,
col_label = "**n(row)**") %>%
modify_header(label = "",
stat_by = "**{level}**") %>%
modify_footnote(everything() ~ NA) %>%
italicize_levels() %>%
italicize_labels() %>%
list()
)
# stack tables
tbl <-
tbl_stack(
tbls = df_results$tbl,
group_header = df_results$Country
)
推荐阅读
- javascript - 在 React 中提交表单之前如何调用 confirm()?
- python - 开始新的 Whatsapp 聊天 Selenium Python
- python - tf.placeholder() 和 tf.get_variable() 的新版本是什么?
- python - 尝试检查字符串中是否存在字符,如果存在则返回 False
- python - Python3 - Leetcode 问题示例用例失败
- javascript - 如何使用 dropzonejs 添加水印
- c++ - 检查逆时针方向而不是顺时针方向
- python - 有没有办法替换 Pytorch 中用于 DDP(DistributedDataParallel) 的“allreduce_hook”?
- php - 在结账时更改 WooCommerce Stripe 的支付卡图标
- amazon-cloudformation - 在 AppSync 中链接多个突变