首页 > 解决方案 > 从调查对象创建汇总统计数据的分层表(数据透视表)

问题描述

我无法通过 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

标签: rpivot-tablecrosstabgtsummary

解决方案


这是一个让您非常接近您提供的模拟表的示例。您可以将输出转换为 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
  )

在此处输入图像描述


推荐阅读