我正在尝试创建一个简单的代码,我可以一遍又一遍地重用(进行最少的调整),以便能够打印汇总统计表。
一个可重现的示例为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)。像这样:
关闭,但没有雪茄:
dplyr::group_by(df, Group) %>%
dplyr::summarise(dplyr::across(.cols = c(V1, V2), .fns = c(mean, sd)))
Run Code Online (Sandbox Code Playgroud)
但是我不知道如何在不制作多个表并rbind()
用于堆叠它们的情况下对其进行缩放。
table1()
( vignette )的格式,但据我所知,我只能按另一个变量对 M/SD 列进行分层。我真的希望我可以添加额外的分组变量。排序有限制,但如果我们使用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)
在外部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)
归档时间: |
|
查看次数: |
323 次 |
最近记录: |