使用 dplyr 创建多功能描述表

soc*_*her 4 r summary dplyr

我正在尝试创建一个简单的代码,我可以一遍又一遍地重用(进行最少的调整),以便能够打印汇总统计表。

一个可重现的示例为V1按组分解的变量创建了一个包含 M 和 SD 的表:

data <- as.data.frame(cbind(1:100, sample(1:2), rnorm(100), rnorm(100)))
names(data) <- c("ID", "Group", "V1", "V2")


library(dplyr)
descriptives <- data %>% group_by(Group) %>%
  summarize(
    Mean = mean(V2)
    , SD = sd(V2)
  )

descriptives
Run Code Online (Sandbox Code Playgroud)

我想修改这个函数,以便它为我的数据集中的所有变量计算 M 和 SD。

我希望能够将调用替换为V1类似vars数据集中所有变量的列表;在这个例子中,V1 和 V2。但通常我有 100 个变量。我希望它以这种方式工作的原因是,我可以做一些非常简单的事情,例如:

vars <- names(data[3:4])
Run Code Online (Sandbox Code Playgroud)

并非常快速地选择我想要汇总统计的列。

我的愿望清单有几件事:

给定变量的 M 和 SD 应该彼此相邻,我想在每对上方添加一个带有变量名称的列。

我希望最终产品看起来像

这个例子表

我想使用 dplyr,但我愿意接受其他选择。我还想了解如何切换表的行和列,以便变量位于不同的行上,并且每个组都有一列(或两列,一列用于 M,另一列用于 SD)。像这样: 另一个示例表

关闭,但没有雪茄:

  1. newish summarise(across()) 有助于:
dplyr::group_by(df, Group) %>% 
  dplyr::summarise(dplyr::across(.cols = c(V1, V2), .fns = c(mean, sd)))
Run Code Online (Sandbox Code Playgroud)

但是我不知道如何在不制作多个表并rbind()用于堆叠它们的情况下对其进行缩放。

  1. 我真的很喜欢table1()( vignette )的格式,但据我所知,我只能按另一个变量对 M/SD 列进行分层。我真的希望我可以添加额外的分组变量。

akr*_*run 5

排序有限制,但如果我们使用select,则可以对列名上的子字符串重新排序

library(dplyr)
library(stringr)
data %>%
    group_by(Group) %>% 
    summarise_at(vars(vars), list(Mean = mean, SD = sd)) %>% 
    select(Group, order(str_remove(names(.)[-1], "_.*")) + 1)
# A tibble: 2 x 5
#  Group V1_Mean V1_SD  V2_Mean V2_SD
#  <dbl>   <dbl> <dbl>    <dbl> <dbl>
#1     1   0.165 0.915  0.146   1.16 
#2     2   0.308 1.31  -0.00711 0.854
Run Code Online (Sandbox Code Playgroud)


Wal*_*ldi 3

在外部dplyr,您可以使用允许从表公式创建汇总统计信息的tables包:

library(tables)

vars <- c("V1","V2")
vars <- paste(vars, collapse="+")

table <- as.formula(paste("(group = factor(Group)) ~ (", vars ,")*(mean+sd)"))
table
# (group = factor(Group)) ~ (V1 + V2) * (mean + sd)

tables::tabular(table, data = data)
#       V1              V2            
# group mean     sd     mean    sd    
# 1     -0.15759 0.9771  0.1405 1.0697
# 2      0.05084 0.9039 -0.1470 0.9949
Run Code Online (Sandbox Code Playgroud)