R 对多个变量应用多个函数(长格式)

R 对多个变量应用多个函数(长格式),r,dplyr,data.table,R,Dplyr,Data.table,我已经阅读了几个相关的线程,了解如何将许多不同的函数应用于data.tables中的许多不同列。 和。他们都很有帮助,但我正在寻找一个更优雅的解决方案来解决类似的问题 从以上两个链接中,可以看到以下代码: library(data.table) DT <- data.table(x= rnorm(50), y = rnorm(50), treatment = c(0,1)) vars <- c("x", "y") my.summary

我已经阅读了几个相关的线程,了解如何将许多不同的函数应用于data.tables中的许多不同列。 和。他们都很有帮助,但我正在寻找一个更优雅的解决方案来解决类似的问题

从以上两个链接中,可以看到以下代码:

library(data.table)

DT <- data.table(x= rnorm(50), y = rnorm(50), treatment = c(0,1))
vars <- c("x", "y")
  
my.summary = function(x) c(Mean = mean(x, na.rm = T), Min = min(x, na.rm = T), Q1 = quantile(x, 0.25, na.rm =T), 
                             Median = median(x, na.rm = T), Q3 = quantile(x, 0.75, na.rm=T), Max = max(x, na.rm = T)) 
summ_stats <- DT[, as.list(unlist(lapply(.SD, my.summary))), .SDcols = vars, by = .(treatment)]

我正在寻找类似的东西,但我想要的(使用data.table的速度)是如下所示:

variable treatment  Max Min Q1 Median Q3, Max, p.value 
x           0
            1
y           0
            1


如有任何建议,将不胜感激

从OP的输出中,我们可以使用
melt
来重塑为“长”格式

library(data.table)
out <- melt(summ_stats, id.vars = 'treatment', measure = 
 patterns("Mean", "Min", "Q1.25%", "Median", "Q3.75%", "Max"), 
  value.name = c("Mean", "Min", "Q1.25%", "Median", "Q3.75%", "Max") )[, 
         variable := c("x", "y")[variable]][]

out[duplicated(variable), variable := ""][]
setcolorder(out, c("variable", setdiff(names(out), "variable")))
out
#   variable treatment        Mean       Min     Q1.25%      Median    Q3.75%      Max
#1:        x         0 -0.04316915 -1.624365 -0.5417604 -0.16117851 0.4965782 2.229262
#2:                  1  0.14239444 -2.904899 -0.7059286  0.27866472 1.2693872 1.696948
#3:        y         0  0.32307227 -1.648222 -0.4209979  0.49096737 1.3184009 2.507111
#4:                  1 -0.21832078 -1.890027 -0.6968235 -0.08252376 0.3694591 1.034514
f
前缀函数已经过优化,速度会非常快

此外,
descr
可以得到每组的分位数以及其他描述性统计数据

descr(DT,  g = DT$treatment) 

从OP的输出中,我们可以使用
melt
将其重塑为“长”格式

library(data.table)
out <- melt(summ_stats, id.vars = 'treatment', measure = 
 patterns("Mean", "Min", "Q1.25%", "Median", "Q3.75%", "Max"), 
  value.name = c("Mean", "Min", "Q1.25%", "Median", "Q3.75%", "Max") )[, 
         variable := c("x", "y")[variable]][]

out[duplicated(variable), variable := ""][]
setcolorder(out, c("variable", setdiff(names(out), "variable")))
out
#   variable treatment        Mean       Min     Q1.25%      Median    Q3.75%      Max
#1:        x         0 -0.04316915 -1.624365 -0.5417604 -0.16117851 0.4965782 2.229262
#2:                  1  0.14239444 -2.904899 -0.7059286  0.27866472 1.2693872 1.696948
#3:        y         0  0.32307227 -1.648222 -0.4209979  0.49096737 1.3184009 2.507111
#4:                  1 -0.21832078 -1.890027 -0.6968235 -0.08252376 0.3694591 1.034514
f
前缀函数已经过优化,速度会非常快

此外,
descr
可以得到每组的分位数以及其他描述性统计数据

descr(DT,  g = DT$treatment) 

基本(
data.frame
)、dplyr(
tbl_df
)或
数据都没有。表
显示类似的表。您所要求的并不是关于数据处理(为其设计了
dplyr
data.table
),而是关于报表呈现。如果不是为了报表,我不鼓励修改数据使其看起来像这样,因为以后对它所做的任何操作都可能需要推断空值应该是什么,虽然这对于控制它的组合方式似乎是无害的,但在失败之前都很简单。谢谢您的评论!它将用于一个报告,我将上面修改的data.table放入R markdown笔记本中的kable()函数中。不过,感谢您的评论!基本(
data.frame
)、dplyr(
tbl_df
)或
数据都没有。表
显示类似的表。您所要求的并不是关于数据处理(为其设计了
dplyr
data.table
),而是关于报表呈现。如果不是为了报表,我不鼓励修改数据使其看起来像这样,因为以后对它所做的任何操作都可能需要推断空值应该是什么,虽然这对于控制它的组合方式似乎是无害的,但在失败之前都很简单。谢谢您的评论!它将用于一个报告,我将上面修改的data.table放入R markdown笔记本中的kable()函数中。不过,感谢您的评论!