Я хочу найти децили для каждой сгруппированной переменной. Я специально ищу методы, используя dplyr
и lapply
. Буду признателен, если вы сможете мне помочь.Децили по групповой переменной в R
Вот мои, что я пробовал. Я не знаю, как вытащить децилями непосредственно, кроме вызова dplyr::ntile()
(который не работает для меня)
Покушение 1
Вот что я попытался с помощью describe()
из Hmisc
пакета:
set.seed(10)
IData <- data.frame(let = sample(x = LETTERS, size = 10000, replace=TRUE), numbers = sample(x = c(1:20000),size = 10000))
Output<-IData %>% data.table::as.data.table(.) %>% split(.,by=c("let"),drop = TRUE,sorted = TRUE) %>% purrr::map(~describe(.$numbers))
Это, безусловно, помогает, но есть две проблемы с вышеуказанным кодом:
a) Выход (даже формат списка) не является тем, что я ищу.
b) Я действительно не знаю, как извлечь 5%, 10% ... из списка выше.
Bottomline, что я застрял
Покушение 2
Я попытался заменить describe
на ntile
, но следующий код дал мне выход, который не имеет смысла для меня, потому что числа столбцы не 10. После запуска Output[[1]]
, я вижу вектор ~ 400 чисел вместо 10.
Output<-IData %>% data.table::as.data.table(.) %>% split(.,by=c("let"),drop = TRUE,sorted = TRUE) %>% purrr::map(~dplyr::ntile(.$numbers,10))
Попытка 3 = Ожидаемый результат
Наконец, я попытался перейти в старую школу (т. копипаст), чтобы получить ожидаемый результат:
Output<-IData %>%
dplyr::group_by(let) %>%
dplyr::summarise(QQuantile1 = quantile(`numbers`, c(.10)),
QQuantile1 = quantile(`numbers`, c(.10)),
QQuantile2 = quantile(`numbers`, c(.20)),
QQuantile3 = quantile(`numbers`, c(.30)),
QQuantile4 = quantile(`numbers`, c(.40)),
QQuantile5 = quantile(`numbers`, c(.50)),
QQuantile6 = quantile(`numbers`, c(.60)),
QQuantile7 = quantile(`numbers`, c(.70)),
QQuantile8 = quantile(`numbers`, c(.80)),
QQuantile9 = quantile(`numbers`, c(.90)),
QQuantile10 = quantile(`numbers`, c(.100)))
Вопрос: Может кто-то пожалуйста, помогите мне, чтобы произвести выше вывод, используя эти три (а не один, а предпочтительно все методы обучения)
1) lapply
2) dplyr
3) data.table
Я смотрел на несколько ниток s on SO, но все они говорят о конкретном квантиле, и не все из них. Например. Find top deciles from dataframe by group нить.
'library (tidyverse); IData%>% group_by (let)%>% sumize (quant_prob = list (paste0 ('quant', seq (.1, 1, .1))), quant_value = list (quantile (числа, seq (.1, 1) , .1))))%>% unpest()%>% spread (quant_prob, quant_value) 'возможно, хотя, вероятно, более полезно оставить его в длинной форме – alistaire
@Alistaire - Спасибо за вашу помощь. Как вы думаете, вы могли бы также помочь мне с версией 'lapply' и' Data.Table', чтобы я мог изучить новые способы решения одной и той же проблемы? – watchtower
Хм, по-видимому, база R думает так же, как и вы: 'aggregate (numbers ~ let, IData, quantile, seq (.1, 1, .1))' – alistaire