R DataTable Преобразование данных в среднее значение и квантили - PullRequest
1 голос
/ 27 мая 2020
data = data.frame(a = runif(100), b = runif(100), c = runif(100), d = runif(100))

Если я буду sh преобразовать в среднее всех a, b, c и d, я могу сделать это:

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

Но что, если я ищу среднее и квантили, такие как

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

Как я могу сделать все это сразу в data.table и заполнить такую ​​data.table следующим образом:

enter image description here

1 Ответ

2 голосов
/ 27 мая 2020

Мы можем melt данные в «длинном» формате, сгруппированные по «переменной», получить mean в 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'))

Или используйте setNames в melt

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