我正在尝试使用 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
一起调整
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