Как использовать квантильную функцию с dplyr - PullRequest
1 голос
/ 28 марта 2020

Я пытаюсь вычислить 25, 50 и 75 процентиль всех количественных переменных, сгруппированных по spe cie ириса набора данных, поэтому с помощью функции dplyr :: sumrize_at это можно сделать только один раз. Я использую следующий код, но всегда получаю сообщение об ошибке:

iris %>%
  group_by(Species) %>% 
  summarize_at(dplyr::vars(c("Sepal.Length","Sepal.Width","Petal.Length","Petal.Width")),
               .funs=c("25%"=quantile(0.25),
                       "50%"=quantile(0.50),
                       "75%"=quantile(0.75)))

Это ошибка, которую я получаю: "Ошибка: ожидание односторонней формулы, функции или имени функции."

Спасибо за помощь.

Ответы [ 2 ]

2 голосов
/ 28 марта 2020

Я могу предложить вам data.table решение. К сожалению, я не имею в виду решения dplyr.

dt <- data.table::as.data.table(iris)

dt <- dt[,lapply(.SD, quantile, probs = c(.25,.5,.75)),
   .SDcols = c("Sepal.Length","Sepal.Width","Petal.Length","Petal.Width"),
   by = "Species"]

dt[,'quantile' := c("25%","50%","75%")]

# Sepal.Length Sepal.Width Petal.Length Petal.Width # Species Sepal.Length Sepal.Width Petal.Length Petal.Width quantile
# 1:     setosa        4.800       3.200        1.400         0.2      25%
# 2:     setosa        5.000       3.400        1.500         0.2      50%
# 3:     setosa        5.200       3.675        1.575         0.3      75%
# 4: versicolor        5.600       2.525        4.000         1.2      25%
# 5: versicolor        5.900       2.800        4.350         1.3      50%
# 6: versicolor        6.300       3.000        4.600         1.5      75%
# 7:  virginica        6.225       2.800        5.100         1.8      25%
# 8:  virginica        6.500       3.000        5.550         2.0      50%
# 9:  virginica        6.900       3.175        5.875         2.3      75%

Надеюсь, это поможет!

1 голос
/ 28 марта 2020

Используя версию для разработчика dplyr (0.8.9), мы можем использовать summarise с across. Один недостаток заключается в том, что имена квантилей не возвращаются, хотя мы можем это знать, поскольку мы выполняем наши операции в желаемом порядке:

iris %>%
  group_by(Species) %>% 
   summarise(across(is.numeric,~c(`25%`=quantile(.x,0.25), `50%`=
                                       quantile(.x,0.5),
                                     `75%`= quantile(.x,0.75))))

Вышеуказанное эквивалентно:

 iris %>%
   group_by(Species) %>% 
   summarise_if(is.numeric,~c(`25%`=quantile(.x,0.25), `50%`=
                                       quantile(.x,0.5),
                                     `75%`= quantile(.x,0.75)))

Результат:

# A tibble: 9 x 5
  Species    Sepal.Length Sepal.Width Petal.Length Petal.Width
  <fct>             <dbl>       <dbl>        <dbl>       <dbl>
1 setosa             4.8         3.2          1.4          0.2
2 setosa             5           3.4          1.5          0.2
3 setosa             5.2         3.68         1.58         0.3
4 versicolor         5.6         2.52         4            1.2
5 versicolor         5.9         2.8          4.35         1.3
6 versicolor         6.3         3            4.6          1.5
7 virginica          6.22        2.8          5.1          1.8
8 virginica          6.5         3            5.55         2  
9 virginica          6.9         3.18         5.88         2.3

Возможность добавить имена квантилей. Однако обратите внимание, что dplyr и tidyverse не перезаписывают векторы, что означает, что нам придется жестко закодировать это:

iris %>%
  group_by(Species) %>% 
   summarise_if(is.numeric,~c(`25%`=quantile(.x,0.25), `50%`=
                                       quantile(.x,0.5),
                                     `75%`= quantile(.x,0.75))) %>% 
   mutate(quant= rep(c("25%","50%","75%"),nrow(.) / 3))

Вы также можете сохранить результат summarise (res здесь) и прибегнуть к старому доброму base для переработки: res$quant <- c("25%","50%","75%")

# A tibble: 9 x 6
  Species    Sepal.Length Sepal.Width Petal.Length Petal.Width quant
  <fct>             <dbl>       <dbl>        <dbl>       <dbl> <chr>
1 setosa             4.8         3.2          1.4          0.2 25%  
2 setosa             5           3.4          1.5          0.2 50%  
3 setosa             5.2         3.68         1.58         0.3 75%  
4 versicolor         5.6         2.52         4            1.2 25%  
5 versicolor         5.9         2.8          4.35         1.3 50%  
6 versicolor         6.3         3            4.6          1.5 75%  
7 virginica          6.22        2.8          5.1          1.8 25%  
8 virginica          6.5         3            5.55         2   50%  
9 virginica          6.9         3.18         5.88         2.3 75% 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...