我正在尝试创建一个简单的代码,我可以一遍又一遍地重用(进行最少的调整),以便能够打印汇总统计表。
一个可重现的示例为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) 我使用 ggplot 创建了这些半小提琴图。但是,我不想包含显示中位数的箱线图,而是包含一条带有平均值的水平线。这意味着每个彩色一半都有自己的平均线:金色一半的平均线不会与灰色一半的平均线完全对齐。重要的是,我希望平均线仅位于密度图中。我怎样才能实现这个目标?我无法弄清楚,我将不胜感激任何帮助!
以下是一些示例数据:
set.seed(20160229)
my_data = data.frame(
y=c(rnorm(1000), rnorm(1000, 0.5), rnorm(1000, 1), rnorm(1000,
1.5)),
x=c(rep('a', 2000), rep('b', 2000)),
m=c(rep('i', 1000), rep('j', 2000), rep('i', 1000))
)
Run Code Online (Sandbox Code Playgroud)
这是 geom_violin 的扩展,用于创建 split_geom_violin:
GeomSplitViolin <- ggproto("GeomSplitViolin", GeomViolin, draw_group = function(self, data, ..., draw_quantiles = NULL){
data <- transform(data, xminv = x - violinwidth * (x - xmin), xmaxv = x + violinwidth * (xmax - x))
grp <- data[1,'group']
newdata <- plyr::arrange(transform(data, x = if(grp%%2==1) xminv else xmaxv), if(grp%%2==1) y else -y)
newdata …
Run Code Online (Sandbox Code Playgroud)