相关疑难解决方法(0)

使用dplyr窗口函数计算百分位数

我有一个有效的解决方案,但我正在寻找一个更清晰,更易读的解决方案,可能会利用一些较新的dplyr窗口函数.

使用mtcars数据集,如果我想查看第25,第50,第75百分位数以及每加仑英里数("mpg")和气缸数("cyl"),我使用以下代码:

library(dplyr)
library(tidyr)

# load data
data("mtcars")

# Percentiles used in calculation
p <- c(.25,.5,.75)

# old dplyr solution 
mtcars %>% group_by(cyl) %>% 
  do(data.frame(p=p, stats=quantile(.$mpg, probs=p), 
                n = length(.$mpg), avg = mean(.$mpg))) %>%
  spread(p, stats) %>%
  select(1, 4:6, 3, 2)

# note: the select and spread statements are just to get the data into
#       the format in which I'd like to see it, but are not critical
Run Code Online (Sandbox Code Playgroud)

有没有一种方法可以使用dplyr使用一些汇总函数(n_tiles,percent_rank等)更干净地完成这项工作?干净利落,我的意思是没有"做"声明.

谢谢

r dplyr tidyr

47
推荐指数
6
解决办法
4万
查看次数

为什么sum()在这个dplyr表达式中工作,而quantile()不是?

我想计算数据帧每一行的分位数,并将结果作为矩阵返回.因为我想计算和任意数量的分位数(我想,一次计算它们的速度更快,而不是重新运行该函数),我尝试使用我在这个问题中找到的公式:

library(dplyr)
df<- as.data.frame(matrix(rbinom(1000,10,0.5),nrow = 2))

interim_res <- df %>% 
              rowwise() %>% 
              do(out = sapply(min(df):max(df), function(i) sum(i==.)))

interim_res <- interim_res[[1]] %>% do.call(rbind,.) %>% as.data.frame(.)
Run Code Online (Sandbox Code Playgroud)

这是有道理的,但是当我尝试将相同的框架应用于quantile()函数时,如此处编码,

interim_res <- df %>% 
              rowwise() %>% 
              do(out = quantile(.,probs = c(0.1,0.5,0.9)))

interim_res <- interim_res[[1]] %>% do.call(rbind,.) %>% as.data.frame(.)
Run Code Online (Sandbox Code Playgroud)

我收到此错误消息:

sort.int中的错误(x,na.last = na.last,减少=减少,...):

'x'必须是原子的

为什么我会收到错误quantile而不是sum?我该如何解决这个问题?

r dplyr

4
推荐指数
1
解决办法
446
查看次数

标签 统计

dplyr ×2

r ×2

tidyr ×1