多个变量的汇总统计,统计为行,变量为列?

Luc*_*aia 2 r dplyr summarize tidyverse across

我正在尝试使用 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. 
Run Code Online (Sandbox Code Playgroud)

为什么不能直接用summary来做呢?正如colwise 小插图所建议的那样,似乎比使用函数列表更优雅。这是否违反了整洁数据框的原则?(在我看来,将一堆数据帧放在一起并不太整洁。)

Ada*_*dam 5

这是一种purrr用于迭代函数列表的方法。这实际上是你正在做的事情bind_rows(),但代码更少。

library(dplyr)
library(purrr)

funs <- lst(min, median, mean, max, sd)

map_dfr(funs,
        ~ summarize(starwars, across(where(is.numeric), .x, 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.
Run Code Online (Sandbox Code Playgroud)