【发布时间】:2021-08-07 21:39:38
【问题描述】:
我正在尝试使用 dplyr::summarize() 和 dplyr::across() 来获得一个小标题,其中包含行中的几个汇总统计信息和列中的变量。我只能通过使用 dplyr::bind_rows() 来实现这个结果,但我想知道是否有更优雅的方式来获得相同的输出。
> library(tidyverse)
── Attaching packages ────────────────────────────────────────────── tidyverse 1.3.1 ──
✔ ggplot2 3.3.3 ✔ purrr 0.3.4
✔ tibble 3.1.1 ✔ dplyr 1.0.6
✔ tidyr 1.1.3 ✔ stringr 1.4.0
✔ readr 1.4.0 ✔ forcats 0.5.1
── Conflicts ───────────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag() masks stats::lag()
>
> bind_rows(min = summarize(starwars, across(where(is.numeric), min,
+ na.rm = TRUE)),
+ median = summarize(starwars, across(where(is.numeric), median,
+ na.rm = TRUE)),
+ mean = summarize(starwars, across(where(is.numeric), mean, na.rm = TRUE)),
+ max = summarize(starwars, across(where(is.numeric), max, na.rm = TRUE)),
+ sd = summarize(starwars, across(where(is.numeric), sd, na.rm = TRUE)),
+ .id = "statistic")
# A tibble: 5 x 4
statistic height mass birth_year
<chr> <dbl> <dbl> <dbl>
1 min 66 15 8
2 median 180 79 52
3 mean 174. 97.3 87.6
4 max 264 1358 896
5 sd 34.8 169. 155.
为什么不能直接用summary来做呢?正如colwise vignette 所建议的那样,似乎比使用函数列表更优雅。这是否违反了整洁数据框的原则? (在我看来,将一堆数据帧一个接一个地放样远不那么整洁。)
【问题讨论】:
-
所需输出中的每一行都有不同的定义。第 1 行是最小值,第 2 行是中位数,等等。因此,虽然这可能很方便使用,但您不会对该输出的整个列进行操作(例如,您不会对高度求和)。所以我不确定输出是否被认为是整洁的。
summarize为您提供广泛输出的方式可能更“整洁”,但我理解您为什么要以这种方式使用它。很多都是哲学,只是理解你想用数据做什么。 -
这是一个很好的观点。如果我在行中有变量并在列中有统计信息,你认为它会更整洁吗?出于演示的目的,这也很好。
-
您希望以整齐的格式存储和处理数据。对于演示,做最能传达它的东西。您所拥有的可能适合演示。我不会过分强调让您的演示文稿表“整洁”。
标签: r dplyr tidyverse summarize across