使用分位数和其他统计数据在data.table中进行汇总统计

问题描述 投票:0回答:1

我正在尝试使用 R 中的 data.table 来汇总数据。问题是,在我的汇总框架中,使用

quantile
会以行而不是列的形式输出结果。我有一个足够简单的解决方法,但我想看看是否有更直接的方法来获得我想要的输出。

library(data.table)
library(magrittr)

#create some example data
dt<-data.table(ID=rep(1:3, each=100),
              val=rnorm(300,100, sd=20))

#define percentiles of interest
percs=c(0.05, 0.10, 0.50, 0.75, 0.90, 0.95)

以下代码提供了我想要的所有数据,但不是我想要的格式。它将每个百分位数放在一个新行上,然后复制以前的汇总统计数据(平均值、中位数、最大最小值)。我希望每个百分位数都在一个新列中。

#Summarize the data - this is the brevity I want but the format puts the percentiles in new rows
dt[,.(mean=mean(val, na.rm=T),
      Median=median(val, na.rm=T),
      min=min(val, na.rm=T),
      max=max(val, na.rm=T),
      as.list(quantile(val, probs=percs, na.rm=T))),
   by=ID]

以下代码为我提供了我想要的格式,但现在我正在执行两个操作并将结果粘合在一起。最终这很好,但我更喜欢像前面的代码片段一样的代码结构,其输出格式如下。

#summarize data - this is the format I want it in but don't want the extra operations
dt[,.(mean=mean(val, na.rm=T),
      Median=median(val, na.rm=T),
      min=min(val, na.rm=T),
      max=max(val, na.rm=T)),
    by=ID]%>%
cbind(.,dt[,setDT(as.list(quantile(val, probs=percs, na.rm=T))),by=ID][,-1]) #-1 to remove extraneous ID column
r data.table quantile
1个回答
0
投票

一起调整

list
/
.
c()

dt[, c(.(mean=mean(val, na.rm=T),
      Median=median(val, na.rm=T),
      min=min(val, na.rm=T),
      max=max(val, na.rm=T)),
      as.list(quantile(val, probs=percs, na.rm=T))),
   by=ID]

##      ID     mean    Median      min      max       5%      10%       50%      75%      90%      95%
##   <int>    <num>     <num>    <num>    <num>    <num>    <num>     <num>    <num>    <num>    <num>
##1:     1 98.10946 100.26609 48.79013 146.2197 63.89160 74.69887 100.26609 111.0710 120.4167 123.0090
##2:     2 99.60213  97.59593 43.34578 154.0955 70.26721 78.71858  97.59593 113.1770 122.5518 129.5174
##3:     3 99.77979 101.09318 51.12685 154.8843 69.68815 77.37456 101.09318 109.0072 123.1126 129.3033
© www.soinside.com 2019 - 2024. All rights reserved.