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

Max*_*cia 4 r dplyr

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

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?我该如何解决这个问题?

Bro*_*ieG 8

.in do是一个数据框,这就是你得到错误的原因.这有效:

df %>% 
  rowwise() %>% 
  do(data.frame(as.list(quantile(unlist(.),probs = c(0.1,0.5,0.9)))))
Run Code Online (Sandbox Code Playgroud)

但风险极其缓慢.为什么不呢:

apply(df, 1, quantile, probs = c(0.1,0.5,0.9))
Run Code Online (Sandbox Code Playgroud)

以下是一些数据量较大的时间:

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

library(microbenchmark)
microbenchmark(
  df %>% rowwise() %>% do(data.frame(as.list(quantile(unlist(.),probs = c(0.1,0.5,0.9))))),
  apply(df, 1, quantile, probs = c(0.1,0.5,0.9)),
  times=5
) 
Run Code Online (Sandbox Code Playgroud)

生产:

            min        lq      mean    median        uq       max neval
dplyr 2375.2319 2376.6658 2446.4070 2419.4561 2454.6017 2606.0794     5
apply  224.7869  231.7193  246.7137  233.4757  245.0718  298.5144     5    
Run Code Online (Sandbox Code Playgroud)

如果你走的apply路线,你可能应该坚持使用矩阵.