boxplot.stats в дплыр с группами - PullRequest
3 голосов
/ 19 июня 2019

Мне нужно рассчитать статистику boxplot для data.frame со многими, многими группами.

В идеале мне нужно:

library(dplyr)
iris %>%
  group_by(Species) %>%
  summarise(boxplot=boxplot.stats(Sepal.Length))) # + some kind of magic

# A tibble: 3 x 6
  Species    lower_whisker lower_hinge median upper_hinge upper_whisker
  <fct>              <dbl>       <dbl>  <dbl>       <dbl>         <dbl>
1 setosa               4.3         4.8    5           5.2           5.8
2 versicolor           4.9         5.6    5.9         6.3           7  
3 virginica            5.6         6.2    6.5         6.9           7.9

Но до сих пор мне удалось сделать картографию наполовину purrr и я не могу ее распаковать.

boxplot.stats2 <- function(x, ...) {
  res <- boxplot.stats(x, ...)
  res <- res$stats
  names(res) <- c('lower_whisker','lower_hinge','median','upper_hinge','upper_whisker')
  #t(as.data.frame(res))
  res
}

iris %>%
  group_by(Species) %>%
  summarise(boxplot=list(boxplot.stats2(Sepal.Length)),
    #manual unpacking
    lower_whisker = boxplot[[1]]['lower_whisker'],
    lower_hinge = boxplot[[1]]['lower_hinge'],
    median = boxplot[[1]]['median'],
    upper_hinge = boxplot[[1]]['upper_hinge'],
    upper_whisker = boxplot[[1]]['upper_whisker']
  )

Это дает тот же результат, но я подозреваю, что должно быть более элегантное решение для него.

1 Ответ

2 голосов
/ 19 июня 2019

Если вы используете список в качестве сводного вывода, вы можете использовать функции unnest() из пакета tidyr .

Разрабатываемая версия tidyr имеет несколько новых функций, включая unnest_wider(), который является удобным инструментом для вашей ситуации.

Здесь я возьму только 5 чисел статистики бокса и внесу их в список в summarise(), так же, как вы начали делать. Я также называю их, так как статистика из boxplot.stats() не имеет никакой идентифицирующей информации.

Новый столбец является столбцом списка, содержащим именованный вектор из 5 значений для каждого вида.

library(dplyr)
library(tidyr) # development version, tidyr_0.8.3.9000

iris %>%
    group_by(Species) %>%
    summarise(boxplot= list( setNames(boxplot.stats(Sepal.Length)$stats,
                                      c('lower_whisker','lower_hinge','median','upper_hinge','upper_whisker') ) ) )

# A tibble: 3 x 2
  Species    boxplot  
  <fct>      <list>   
1 setosa     <dbl [5]>
2 versicolor <dbl [5]>
3 virginica  <dbl [5]>

После этого с unnest_wider() вы получите желаемый результат.

iris %>%
    group_by(Species) %>%
    summarise(boxplot= list( setNames(boxplot.stats(Sepal.Length)$stats,
                                      c('lower_whisker','lower_hinge','median','upper_hinge','upper_whisker') ) ) ) %>%
    unnest_wider(boxplot)

# A tibble: 3 x 6
  Species    lower_whisker lower_hinge median upper_hinge upper_whisker
  <fct>              <dbl>       <dbl>  <dbl>       <dbl>         <dbl>
1 setosa               4.3         4.8    5           5.2           5.8
2 versicolor           4.9         5.6    5.9         6.3           7  
3 virginica            5.6         6.2    6.5         6.9           7.9

Вы можете пропустить этап именования, но тогда вам нужно будет назвать столбцы в конце.

iris %>%
    group_by(Species) %>%
    summarise(boxplot= list( boxplot.stats(Sepal.Length)$stats ) ) %>%
    unnest_wider(boxplot)

# A tibble: 3 x 6
  Species     ...1  ...2  ...3  ...4  ...5
  <fct>      <dbl> <dbl> <dbl> <dbl> <dbl>
1 setosa       4.3   4.8   5     5.2   5.8
2 versicolor   4.9   5.6   5.9   6.3   7  
3 virginica    5.6   6.2   6.5   6.9   7.9

Неработающая версия tidyr все еще может помочь в этом, хотя работа займет еще несколько шагов. Поскольку имена списков теряются в текущем unnest(), вам нужно будет добавить их вручную перед отменой, чтобы вы могли spread() в новых столбцах.

iris %>%
group_by(Species) %>%
summarise(boxplot= list( boxplot.stats(Sepal.Length)$stats),
          stat = list( c('lower_whisker','lower_hinge','median','upper_hinge','upper_whisker') ) ) %>%
unnest(stat, boxplot) %>%
spread(stat, boxplot)

# A tibble: 3 x 6
  Species    lower_hinge lower_whisker median upper_hinge upper_whisker
  <fct>            <dbl>         <dbl>  <dbl>       <dbl>         <dbl>
1 setosa             4.8           4.3    5           5.2           5.8
2 versicolor         5.6           4.9    5.9         6.3           7  
3 virginica          6.2           5.6    6.5         6.9           7.9
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...