使用 modelsummary 或类似包显示整个样本以及子组的统计数据

Display statistics for the whole sample as well as subgroups with modelsummary or similar packages

我正在尝试创建一个 table,其中包含整个样本和子组的描述性统计数据。我的目标是使用精彩的 modelsummary R 包 return 一个 table 具有均值、标准差、最小值、中值、最大值和为整个样本计算的变量的图表以及平均值和标准差每个组。我能够通过两个单独的 table 实现这一点。但是,我想将所有这些信息放在一个 table 中,首先是整个样本的统计数据(见图 1),其次是子组(见图 2)。如果可能,我还想为整个样本添加 first-level 标题并将其命名为“全部”或“整个样本”。最后,鉴于我所在领域的期刊需要使用 APA 样式,我想知道是否可以将 table 转换为这种格式(例如,具有所有必需的边框、黑色而不是灰色的文本等) (见图 3)。如果 modelsummary 不能处理这个问题,我也愿意尝试其他包。非常感谢任何愿意提供帮助的人!

library(palmerpenguins)
library(tidyverse)
library(kableExtra)
library(modelsummary)

penguins <- penguins %>% as.data.frame() %>% select(species, bill_length_mm, bill_depth_mm,  flipper_length_mm, body_mass_g)

#scale variables for histogram and boxplot
pen_scaled <- penguins %>% select(bill_length_mm, bill_depth_mm,  flipper_length_mm, body_mass_g) %>% 
  mutate(across(where(is.numeric), ~scale(.))) %>% as.data.frame()

# create a list with individual variables and remove missing
pen_list <- lapply(pen_scaled, na.omit)

# create a table with `datasummary`
# add a histogram with column_spec and spec_hist
# add a boxplot with colun_spec and spec_box
emptycol <- function(x) " "
pen_table <- datasummary(All(penguins) ~ Mean + SD + Min + Median + Max + Heading("Boxplot") * emptycol + Heading("Histogram") * emptycol, data = penguins) %>%
    column_spec(column = 7, image = spec_boxplot(pen_list)) %>%
    column_spec(column = 8, image = spec_hist(pen_list))

pen_table

图一

pen_table2 <- datasummary_balance(~species, data = penguins, dinm = FALSE)

pen_table2

图2

图3

这里有两个问题:

  1. 如何改变table的外观?
  2. 如何创建具有给定形状(尚未具体定义)的 table?

问题 1

使用 kableExtra 包可以非常灵活地配置外观(modelsummary 通过 [=16= 还支持 gthuxtableflextable ] 争论)。更改外观的一种简单方法是使用 kableExtra 中的 kable_classic() 函数,如下所示。如果您有更具体的需求,请参考kableExtra文档:

问题 2

As noted in the documentation for datasummary(),可以用一个1来表示“全样本”。这是一个最小的例子:

library(palmerpenguins)
library(tidyverse)
library(kableExtra)
library(modelsummary)

penguins <- penguins %>% as.data.frame() %>% select(species, bill_length_mm, bill_depth_mm,  flipper_length_mm, body_mass_g)

# scale variables for histogram and boxplot
pen_scaled <- penguins %>% select(bill_length_mm, bill_depth_mm,  flipper_length_mm, body_mass_g) %>% 
  mutate(across(where(is.numeric), ~scale(.))) %>% as.data.frame()
pen_list <- lapply(pen_scaled, na.omit)

emptycol <- function(x) " "
datasummary(All(penguins) ~ Heading("Entire sample") * 1 * (Mean + SD + Min + Median + Max + Heading("Boxplot") * emptycol + Heading("Histogram") * emptycol) + species * (Mean + SD),
            data = penguins) %>%
    column_spec(column = 7, image = spec_boxplot(pen_list)) %>%
    column_spec(column = 8, image = spec_hist(pen_list)) %>%
    kable_classic()