首页 文章

按组分组多个分位数

提问于
浏览
7

我该怎么做这个计算:

library(ddply)
quantile(baseball$ab)
  0%  25%  50%  75% 100% 
  0   25  131  435  705

按群组说,"team"?我想要一个带有rownames "team"和列名"0% 25% 50% 75% 100%"的data.frame,即每组一个 quantile 调用 .

ddply(baseball,"team",quantile(ab))

不是正确的解决方案 . 我的问题是每个分组操作的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

4 回答

  • 2

    您可以使用 dplyr 中的非标准分位数执行此操作:

    library(plyr)
    data(baseball)
    library(dplyr)
    prob=c(0.2, 0.8)
    summarise(group_by(baseball,team), 
        p1 = quantile(ab, probs = prob[1]), 
        p2 = quantile(ab, probs = prob[2]))
    

    注意这是 dplyr::summarise ,而不是 plyr::summarise

  • 3

    使用 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)))
    

    或者, ddply

    ddply(baseball, .(team), function(x) quantile(x$ab))
    
  • 16

    您应该分别定义每个分位数的计算并使用 summarise . 也可以使用 .(team) .

    library(plyr)
    data(baseball)
    ddply(baseball,.(team),summarise, X0 = quantile(ab, probs = 0), X25 = quantile(ab, probs = 0.25), X50 = quantile(ab, probs = 0.50), X75 = quantile(ab, probs = 0.75), X100 = quantile(ab, probs = 1))
    
  • 2

    使用 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)
    

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

    invoke_map 调用似乎是必要的,因为 quantile 不返回数据帧;见this answer .

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

    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))
    

相关问题