首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有群的dplyr中的boxplot.stats

具有群的dplyr中的boxplot.stats
EN

Stack Overflow用户
提问于 2019-06-19 14:06:12
回答 1查看 2.2K关注 0票数 4

我需要计算包含许多组的data.frame的盒图统计数据。

我理想需要的是:

代码语言:javascript
复制
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映射,并且无法解压它。

代码语言:javascript
复制
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']
  )

它给出了同样的结果,但我怀疑应该有一个更优雅的解决方案。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-19 14:44:38

如果使用列表作为摘要输出,则可以使用包unnest()函数tidyr

较新版本的tidyr有一些新的功能,包括unnest_wider(),这是一个非常适合您的情况的工具。

在这里,我将只获得框图统计的5个数字,并将它们放在summarise()中的列表中,就像您开始做的那样。我也给他们起了名字,因为boxplot.stats()的统计数据没有任何识别信息。

新列是一个列表列,包含每个物种5个值的命名向量。

代码语言:javascript
复制
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()进行跟踪将给出所需的结果。

代码语言:javascript
复制
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

您可以跳过命名步骤,但随后需要将列命名为末尾。

代码语言:javascript
复制
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 (pre1.0.0)的旧版本在这里仍然有帮助,尽管这项工作还需要更多的步骤。由于列表名称在当前的unnest()中丢失了,因此需要在取消嵌套之前手动添加这些名称,以便可以将spread()添加到新列中。

代码语言:javascript
复制
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
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56669653

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档