我需要计算包含许多组的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']
)它给出了同样的结果,但我怀疑应该有一个更优雅的解决方案。
发布于 2019-06-19 14:44:38
如果使用列表作为摘要输出,则可以使用包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.9tidyr (pre1.0.0)的旧版本在这里仍然有帮助,尽管这项工作还需要更多的步骤。由于列表名称在当前的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.9https://stackoverflow.com/questions/56669653
复制相似问题