tidyverse 汇总多列但将结果显示为行

des*_*hen 5 r dplyr tidyr summarize

我有数据,我想使用 tidyverse 方法获取多列的一堆汇总统计信息。但是,利用 tidyverse 的summarize功能,它会将每个列统计信息创建为一个新列,而我更愿意将列名称视为行,将每个统计信息视为一个新列。所以我的问题是:

是否有比将summarize函数与 apivot_longer和一起使用更优雅(我知道“优雅”是一个模糊的术语)的方法来实现这一点pivot_wider?

我正在使用 tidyverse 包的最新开发版本,即 dplyr 0.8.99.9003 和 tidyr 1.1.0。因此,如果任何解决方案需要这些包中尚未包含在 CRAN 上的新功能,那也没关系。

library(tidyverse)

dat <- as.data.frame(matrix(1:100, ncol = 5))

dat %>%
  summarize(across(everything(), list(mean = mean,
                                      sum  = sum))) %>%
  pivot_longer(cols      = everything(),
               names_sep = "_",
               names_to  = c("variable", "statistic")) %>%
  pivot_wider(names_from = "statistic")
Run Code Online (Sandbox Code Playgroud)

预期结果:

# A tibble: 5 x 3
  variable  mean   sum
  <chr>    <dbl> <dbl>
1 V1        10.5   210
2 V2        30.5   610
3 V3        50.5  1010
4 V4        70.5  1410
5 V5        90.5  1810
Run Code Online (Sandbox Code Playgroud)

注意:我没有设置任何列的名称,所以如果有一种很好的方法来获取具有不同/通用名称的表的结构,那也很好。

Ron*_*hah 5

您可以pivot_wider使用".value"in跳过该步骤names_to。

library(dplyr)

dat %>%
  summarise_all(list(mean = mean,sum  = sum)) %>%
  tidyr::pivot_longer(cols = everything(),
               names_sep = "_",
               names_to  = c("variable", ".value"))


# A tibble: 5 x 3
#  variable  mean   sum
#  <chr>    <dbl> <int>
#1 V1        10.5   210
#2 V2        30.5   610
#3 V3        50.5  1010
#4 V4        70.5  1410
#5 V5        90.5  1810
Run Code Online (Sandbox Code Playgroud)