我想显示按store 类型(汽车或美容)分层的数据.使用gtsum包tbl_strata()函数可以很好地处理所有变量,但只有一个变量是美容店变量,因此对于汽车店来说完全没有这个变量.对于这一个问题变量,输出在顶行显示为零(NA%),这是我不希望看到的.下面我展示了一个小的、可重现的示例,其中只有几个问题变量的值来显示问题.

以下是我的rmarkdown代码:

library(gtsummary) # for tbl_strata() for more customizable demographics table
library(gt) # for making nice looking display tables
library(tidyverse) # for data wrangling

test.tb <- tibble(
  auto_or_beauty = c("Beauty", "Beauty", "Beauty", "Beauty", "Beauty", "Auto", "Auto", "Beauty", "Beauty", "Beauty"),
  specific_beauty_shop_type = c("Hair only", "Hair and nails", "Hair only", "Hair and nails", "Hair only", NA, NA, "Hair and nails", "Hair only", "Hair only"),
  intervention_group = c("Delayed", "Delayed", "Delayed", "Immediate", "Immediate", "Delayed", "Immediate", "Delayed", "Immediate", "Immediate")
)

test.tb %>%
  # create a tbl_summary() table within each level of auto_or_beauty
  tbl_strata(
    strata = auto_or_beauty,
    .tbl_fun =
      ~ .x %>%
      tbl_summary(by = intervention_group)) %>%
  as_gt()

And here is the output: tbl_strata() output table

我不希望Auto下的顶部行的SPECIFICATE_WARTY_SHOP_TYPE变量为0(NA%)0(NA%).此外,我更希望未知变量的数量显示在变量级别之后的底部,而不是顶部:我将如何做到这一点?(对于我的所有其他变量,UNKNOWN默认为底部.)

谢谢!我刚开始学习gtsum,我很欣赏它的灵活性,因为它允许我准确地指定我想要的表的方式(它比我以前使用的包灵活得多).然而,当我遇到这样一个奇怪的 case 时,我正在苦苦挣扎着该怎么办.

EDIT:我的实际数据表也有其他变量和p值,每个p值都有单独的脚注.我能不能不让它为特定的_FAIETY_SHOP_TYPE变量计算Auto Shop的p值,并且在那里也不加脚注?以下是更新后的示例的代码:

test.tb <- tibble(
  auto_or_beauty = c("Beauty", "Beauty", "Beauty", "Beauty", "Beauty", "Auto", "Auto", "Beauty", "Beauty", "Beauty"),
  specific_beauty_shop_type = c("Hair only", "Hair and nails", "Hair only", "Hair and nails", "Hair only", NA, NA, "Hair and nails", "Hair only", "Hair only"),
  intervention_group = c("Delayed", "Delayed", "Delayed", "Immediate", "Immediate", "Delayed", "Immediate", "Delayed", "Immediate", "Immediate"),
  home_business = c("Yes", "Yes", "No", "No", "No", "Yes", "No", "Yes", "Yes", "No")
)

 
test.tb %>%
  tbl_strata(
    strata = auto_or_beauty,
    .tbl_fun =
      ~ .x %>%
        tbl_summary(by = intervention_group) %>% 
      add_p() %>% 
      separate_p_footnotes()
  )

Revised code output

推荐答案

解决这两个问题的一个 Select 是使用modify_table_body.首先,要摆脱0 (NA%)个单元格,您可以将Auto的stat列设置为NA,以获得"label"行.第二,为了得到正确的顺序,你可以将specific_beauty_shop_type转换为一个因子.但是,这将为非缺失类别添加0 (NA%)个单元格,我们可以通过将"level"行替换为NA来消除这些单元格.

library(gtsummary)
library(dplyr)

test.tb %>%
  mutate(specific_beauty_shop_type = factor(specific_beauty_shop_type)) |> 
  tbl_strata(
    strata = auto_or_beauty,
    .tbl_fun =
      ~ .x %>%
        tbl_summary(by = intervention_group)
  ) |>
  modify_table_body(
    fun = ~ .x |>
      mutate(
        across(
          c(stat_1_1, stat_2_1),
          ~ if_else(row_type %in% c("label", "level"), NA, .x)
        )
      )
  )

enter image description here

根据您的意见,您可以根据if_else中的variable来限制NA的更换:

test.tb <- tibble(
  auto_or_beauty = c("Beauty", "Beauty", "Beauty", "Beauty", "Beauty", "Auto", "Auto", "Beauty", "Beauty", "Beauty"),
  specific_beauty_shop_type = c("Hair only", "Hair and nails", "Hair only", "Hair and nails", "Hair only", NA, NA, "Hair and nails", "Hair only", "Hair only"),
  intervention_group = c("Delayed", "Delayed", "Delayed", "Immediate", "Immediate", "Delayed", "Immediate", "Delayed", "Immediate", "Immediate"),
  home_business = c("Yes", "Yes", "No", "No", "No", "No", "No", "Yes", "Yes", "No")
)

test.tb %>%
  mutate(specific_beauty_shop_type = factor(specific_beauty_shop_type)) |>
  tbl_strata(
    strata = auto_or_beauty,
    .tbl_fun =
      ~ .x %>%
        tbl_summary(by = intervention_group)
  ) |>
  modify_table_body(
    fun = ~ .x |>
      mutate(
        across(
          c(stat_1_1, stat_2_1),
          ~ if_else(
            variable %in% "specific_beauty_shop_type" &
              row_type %in% c("label", "level"), NA, .x
          )
        )
      )
  )

enter image description here

EDIT 2章现在是一团糟我认为下一个附加问题需要另一个问题.(;不幸的是,这种情况没有简单的解决办法,但可以通过编写一个自定义测试函数来解决使用tryCatch的"错误"情况.这样我们就可以捕获错误并返回一个NA的列表.

my_fisher <- function(x, y) {
  tryCatch(
    fisher.test(x, y),
    error = function(e) {
      res <- list(
        p.value = NA,
        method = NA
      )
      class(res) <- "htest"
      res
    }
  )
}

fisher_test <- function(data, variable, by, ...) {
  data <- data[c(variable, by)] %>% dplyr::filter(complete.cases(.))
  my_fisher(data[[variable]], factor(data[[by]])) |>
    broom::tidy()
}

tbl <- test.tb %>%
  mutate(specific_beauty_shop_type = factor(specific_beauty_shop_type)) |>
  tbl_strata(
    strata = auto_or_beauty,
    .tbl_fun =
      ~ .x %>%
        tbl_summary(by = intervention_group) %>%
        add_p(everything() ~ "fisher_test") %>%
        separate_p_footnotes()
  ) |>
  modify_table_body(
    fun = ~ .x |>
      mutate(
        across(
          c(stat_1_1, stat_2_1),
          ~ if_else(
            variable %in% "specific_beauty_shop_type" &
              row_type %in% c("label", "level"), NA, .x
          )
        )
      )
  )

enter image description here

R相关问答推荐

导入到固定列宽的R中时出现问题

如何在弹性表中为类别值的背景上色

从有序数据中随机抽样

使用gggrassure减少地块之间的空间

bslib::card_header中的shine::downloadButton,图标而不是文本

将多列合并为单独的名称—值对

使用R中的正则表达式将一列分割为多列

R-按最接近午夜的时间进行筛选

在保留列表元素属性的同时替换列表元素

从非重叠(非滚动)周期中的最新数据向后开窗并在周期内计数

QY数据的处理:如何定义QY因素的水平

在R中的数据框上使用Apply()函数时,如何保留非数字列?

如何在使用Alpha时让geom_curve在箭头中显示恒定透明度

如何在使用因子时获得Sankey图的Scale_Fill_Viridis的全范围

使用R、拼图和可能的网格包绘制两个地块的公共垂直线

在REST API中使用参数R

将仪表板中的值框大小更改为Quarto

将R中对象的CSV数组转换为JSON数组

我有2011-2022年的年度数据.如何计算最低年份和最高年份之间的差额?

打印的.txt文件,将值显示为&Quot;Num&Quot;而不是值