按组分组多个分位数

Flo*_*ald 13 r plyr

我该怎么做这个计算:

library(ddply)
quantile(baseball$ab)
  0%  25%  50%  75% 100% 
  0   25  131  435  705 
Run Code Online (Sandbox Code Playgroud)

按团队说,由"团队"说?我想要一个带有rownames"team"和列名"0%25%50%75%100%"的data.frame,即quantile每组一个呼叫.

ddply(baseball,"team",quantile(ab))
Run Code Online (Sandbox Code Playgroud)

不是正确的解决方案.我的问题是每个分组操作的OUTPUT是一个长度为5的向量.

换句话说,什么是一个巧妙的解决方案(永远不要头脑):

m=data.frame()
for (i in unique(baseball$team)){m=rbind(m,quantile(baseball[baseball$team==i, ]$ab))}
head(m,3)
  X120 X120.1 X120.2 X120.3 X120.4
1  120  120.0  120.0 120.00    120
2  162  162.0  162.0 162.00    162
3   89   89.0   89.0  89.00     89
Run Code Online (Sandbox Code Playgroud)

Pat*_*ann 20

有了基础,R你可以使用tapplydo.call

library(plyr)
do.call("rbind", tapply(baseball$ab, baseball$team, quantile))

do.call("rbind", tapply(baseball$ab, baseball$team, quantile, c(0.05, 0.1, 0.2)))
Run Code Online (Sandbox Code Playgroud)

或者,与 ddply

ddply(baseball, .(team), function(x) quantile(x$ab))
Run Code Online (Sandbox Code Playgroud)


slh*_*hck 5

使用dplyr以下方法略有不同:

library(tidyverse)

baseball %>% 
  group_by(team) %>% 
  nest() %>% 
  mutate(
    ret = map(data, ~quantile(.$ab, probs = c(0.25, 0.75))),
    ret = invoke_map(tibble, ret)
  ) %>%
  unnest(ret)
Run Code Online (Sandbox Code Playgroud)

在这里,您可以在probs参数中指定所需的分位数。

invoke_map调用似乎是必需的,因为quantile它不会返回数据帧。看到这个答案

您还可以将所有内容放入一个函数中:

get_quantiles <- function(.data, .var, .probs = c(0.25, 0.75), .group_vars = vars()) {
  .var = deparse(substitute(.var))
  return(
    .data %>% 
    group_by_at(.group_vars) %>% 
    nest() %>% 
    mutate(
      ret = map(data, ~quantile(.[[.var]], probs = .probs)),
      ret = invoke_map(tibble, ret)
    ) %>%
    unnest(ret, .drop = TRUE)
  )
}

mtcars %>% get_quantiles(wt, .group_vars = vars(cyl))
Run Code Online (Sandbox Code Playgroud)

一种新的方法是使用group_modify()from dplyr。然后,您将致电:

baseball %>%
  group_by(team) %>% 
  group_modify(~{
    quantile(.x$ab, probs = c(0.25, 0.75)) %>% 
    tibble::enframe()
  }) %>%
  spread(name, value)
Run Code Online (Sandbox Code Playgroud)