首页 > 解决方案 > 将许多函数应用于许多变量(长格式)

问题描述

我已经阅读了几个有关如何将许多不同的函数应用于 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)]

var按状态生成变量的汇总统计信息treatment。输出类似于:

   x.Mean, y Min, y Q1.25%, ..., x.Max, y.Mean, y.Min, ...., y.Max
x
y

我正在寻找类似的东西,但我想要的东西(使用 data.table 的速度)看起来像:

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

任何建议将不胜感激!

标签: rdplyrdata.table

解决方案


从 OP 的输出中,我们可以使用meltreshape 为“long”格式

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

或者另一种选择是collap可以collapse在简化代码中重塑为更方便的格式

library(collapse)
collap(DT, ~ treatment, list(fmean, fmin, fmedian, fmax), return = "long")
#   Function           x           y treatment
#1:    fmean -0.04316915  0.32307227         0
#2:    fmean  0.14239444 -0.21832078         1
#3:     fmin -1.62436453 -1.64822174         0
#4:     fmin -2.90489906 -1.89002714         1
#5:  fmedian -0.16117851  0.49096737         0
#6:  fmedian  0.27866472 -0.08252376         1
#7:     fmax  2.22926220  2.50711115         0
#8:     fmax  1.69694788  1.03451432         1

前缀函数已经优化并且f会非常快

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

descr(DT,  g = DT$treatment) 

推荐阅读