【发布时间】:2017-02-10 06:29:33
【问题描述】:
我想找出每个分组变量的十分位数。我正在专门寻找使用dplyr 和lapply 的方法。如果您能帮助我,我将不胜感激。
这是我的尝试。除了调用dplyr::ntile()(这对我不起作用)之外,我不知道如何直接提取十分位数
尝试 1
这是我尝试使用来自Hmisc 包的describe():
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%...。
底线是我被卡住了
尝试 2
我尝试用ntile 替换describe,但是下面的代码给了我一个对我来说没有意义的输出,因为列数不是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) 应用
2) dplyr
3) 数据表
我查看了关于 SO 的几个主题,但它们都在谈论特定的分位数,而不是全部。例如。 Find top deciles from dataframe by group 线程。
【问题讨论】:
-
library(tidyverse); IData %>% group_by(let) %>% summarise(quant_prob = list(paste0('quant', seq(.1, 1, .1))), quant_value = list(quantile(numbers, seq(.1, 1, .1)))) %>% unnest() %>% spread(quant_prob, quant_value)可能会,尽管将其保留为长格式可能更有用 -
@Alistaire - 感谢您的帮助。您认为您还可以帮助我使用
lapply和Data.Table版本,以便我可以学习解决相同问题的新方法吗? -
嗯,显然 base R 的想法和你一样:
aggregate(numbers ~ let, IData, quantile, seq(.1, 1, .1))
标签: r data.table dplyr lapply purrr