r quantile 함수




dplyr 윈도우 함수를 사용하여 백분위 수 계산하기 (4)

다음은 dplyrpurrr 을 사용하여 quantile을 깔끔한 형식으로 반환하는 꽤 읽기 쉬운 솔루션입니다.

암호

library(dplyr)
library(purrr)

mtcars %>% 
    group_by(cyl) %>% 
    do({x <- .$mpg
        map_dfr(.x = c(.25, .5, .75),
                .f = ~ data_frame(Quantile = .x,
                                  Value = quantile(x, probs = .x)))
       })

결과

# A tibble: 9 x 3
# Groups:   cyl [3]
    cyl Quantile Value
  <dbl>    <dbl> <dbl>
1     4     0.25 22.80
2     4     0.50 26.00
3     4     0.75 30.40
4     6     0.25 18.65
5     6     0.50 19.70
6     6     0.75 21.00
7     8     0.25 14.40
8     8     0.50 15.20
9     8     0.75 16.25

나는 실용적인 해결책을 가지고 있지만 좀 더 새로운 dplyr 윈도우 기능을 활용할 수있는보다 깨끗하고 읽기 쉬운 솔루션을 찾고 있습니다.

mtcars 데이터 세트를 사용하여 실린더 수 ( "cyl")로 25, 50, 75 백분위 수와 평균 및 갤론 당 마일 수 ( "mpg")를보고 싶으면 다음 코드를 사용합니다.

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

일부 요약 기능 (n_tiles, percent_rank 등)을 사용하여 dplyr을 사용하여 더 명확하게 처리 할 수있는 방법이 있습니까? 깔끔하게, 나는 "할"진술이 없다는 것을 의미한다.

고맙습니다


여기에는 피할 do 있지만 각 분위수 값에 대해 별도의 quantile 을 호출 dplyr 접근 방식이 있습니다.

mtcars %>% group_by(cyl) %>%
  summarise(`25%`=quantile(mpg, probs=0.25),
            `50%`=quantile(mpg, probs=0.5),
            `75%`=quantile(mpg, probs=0.75),
            avg=mean(mpg),
            n=n())

  cyl   25%  50%   75%      avg  n
1   4 22.80 26.0 30.40 26.66364 11
2   6 18.65 19.7 21.00 19.74286  7
3   8 14.40 15.2 16.25 15.10000 14

summarisequantile 대한 단일 호출로 여러 값을 리턴 할 수있는 것이 더 좋지만, 이는 dplyr_ 에서 열린 . dplyr .

UPDATE : @ JuliaSilge의 답변에 변형이 있습니다 . 여기에는 중첩을 사용하여 중첩을 사용하지만 map 사용하지 않습니다. 그러나 quantile에 대한 호출에서 직접 quantiles의 이름을 별도의 컬럼으로 포착하는 방법 (또는 가능한 경우)이 확실하지 않기 때문에, quantile 레벨을 나열하는 컬럼을 추가하는 데는 추가 코드 행이 필요합니다. .

p = c(0.25,0.5,0.75)

mtcars %>% 
  group_by(cyl) %>% 
  summarise(quantiles = list(sprintf("%1.0f%%", p*100)),
            mpg = list(quantile(mpg, p))) %>% 
  unnest
    cyl quantiles   mpg
1     4       25% 22.80
2     4       50% 26.00
3     4       75% 30.40
4     6       25% 18.65
5     6       50% 19.70
6     6       75% 21.00
7     8       25% 14.40
8     8       50% 15.20
9     8       75% 16.25

이것은 broom 꾸러미의 tidy() 함수를 사용하는 dplyr 접근법입니다. 불행히도 여전히 do() 가 필요하지만 훨씬 더 간단합니다.

library(dplyr)
library(broom)

mtcars %>%
    group_by(cyl) %>%
    do( tidy(t(quantile(.$mpg))) )

그것은 다음을 제공합니다 :

    cyl   X0.  X25.  X50.  X75. X100.
  (dbl) (dbl) (dbl) (dbl) (dbl) (dbl)
1     4  21.4 22.80  26.0 30.40  33.9
2     6  17.8 18.65  19.7 21.00  21.4
3     8  10.4 14.40  15.2 16.25  19.2

broom 꾸러미에는 명명 된 숫자를위한 메소드가 없으므로 t() 사용합니다.

이것은 summary ()에 대한 이전 답변을 기반으로 합니다 .


dplyr 에서 do() 를 피하는 방법을 dplyr 과 함께 c()as.list() 사용하면 매우 간단합니다.

require(data.table) 
as.data.table(mtcars)[, c(as.list(quantile(mpg, probs=p)), 
                        avg=mean(mpg), n=.N), by=cyl]
#    cyl   25%  50%   75%      avg  n
# 1:   6 18.65 19.7 21.00 19.74286  7
# 2:   4 22.80 26.0 30.40 26.66364 11
# 3:   8 14.40 15.2 16.25 15.10000 14

keyby 정렬하려면 keyby 교체하십시오.





tidyr