首页 > 解决方案 > R DataTable 将数据转换为均值和分位数

问题描述

data = data.frame(a = runif(100), b = runif(100), c = runif(100), d = runif(100))

如果我希望转换为所有 a、b、c 和 d 的平均值,我可以这样做:

setDT(data)
dataMEAN <- data[, lapply(.SD, mean)]

但是,如果我正在寻找平均值和分位数,例如

quantile(data$a, probs=c(.10,.90))

如何在 data.table 中一次完成所有这些并填写这样的 data.table:

在此处输入图像描述

标签: rdata.table

解决方案


我们可以melt将数据以'long'格式,按'variable'分组,得到meana list,与list创建的列连接quantile

library(data.table)
out <- melt(setDT(data))[, c(list(MEAN = mean(value)), 
      as.list(quantile(value, probs = c(.10, .90)))), variable]
out
#   variable      MEAN        10%       90%
#1:        a 0.4903088 0.04842401 0.8790265
#2:        b 0.4890356 0.11788974 0.9221995
#3:        c 0.4890958 0.12364468 0.8670124
#4:        d 0.4638097 0.06690734 0.9448844

setnames(out, 3:4, c('LOWER', 'UPPER'))

或使用setNamesmelt

melt(setDT(data))[, c(list(MEAN = mean(value)), 
  setNames(as.list(quantile(value, probs = c(.10, .90))), 
       c('LOWER', 'UPPER'))), variable]

推荐阅读