【问题标题】:Create a stratified table (pivot table) of summary statistics from a survey object从调查对象创建汇总统计的分层表(数据透视表)
【发布时间】:2021-06-03 14:47:40
【问题描述】:

我在通过 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

【问题讨论】:

  • 您能添加一些您尝试过的数据和代码吗?
  • 您好,请重新阅读帖子。我已经粘贴了代码。

标签: r pivot-table crosstab gtsummary


【解决方案1】:

这是一个让您非常接近您提供的模拟表的示例。您可以使用 as_flex_table() 将输出转换为 flextable,使其更加相似。

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
  )

【讨论】:

  • 优秀的丹尼尔。这非常适合我。但是是否可以进行任何进一步的调整以按字母顺序“排序”国家。仍然 % 位数 =2?我确实实施了例程,但没有成功。体重
  • 您可以按国家/地区排列标题以按您喜欢的顺序获取它们,并使用 tbl_svysummary 中的数字参数指定百分比的数字。您还可以查看 remove_row_type 以删除重复的 Gender 行
  • 恭喜,我回去上班试试!
  • 将这一行小标题附加到df_results。 df_overall % rowwise() %>% mutate( # 在每个国家/地区对设计对象进行子集化 design = df_survey %>% list(), # 在每个层中构造 gtsummary 表 tbl = design %>% tbl_svysummary(by = Result, percent = "row", include = -Country) %>% <...> %>% # 删除以节省空间 list() )
  • 太棒了,再一次。我认为我的问题得到了解答。同事将能够根据他们的需求阅读和调整代码。最后,有一个接近出版格式的表格。这是 gtsummary R 包最棒的地方。
猜你喜欢
  • 2022-10-23
  • 2021-12-14
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-16
  • 2015-07-31
相关资源
最近更新 更多