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

标签 r dplyr tidyr summarize

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

有没有比伴随 summarize 更优雅(我知道“优雅”是一个模糊的术语)的方法来实现这一目标函数带有 pivot_longerpivot_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")

预期结果:
# 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

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

最佳答案

不是 tidyverse解决方案,但 data.table取而代之的是..另外,不确定它是否更“优雅”;-)

但是你去...

library( data.table )
#make 'dat' a data.table
setDT(dat)
#transpose, keeping column names
dat <- transpose(dat, keep.names = "var_name" )
#melt to long and summarise
melt(dat, id.vars = "var_name")[, .(mean = mean(value), sum = sum(value) ), by = var_name]


#    var_name mean  sum
# 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

关于r - tidyverse 汇总多列但将结果显示为行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62042235/

相关文章:

r - 无法在 R 中收集 tibble

r - dplyr 覆盖组中除第一次出现以外的所有值

r - 将 ddply 转换为 dplyr 和 tidyr 代码(变异、联合、传播)

r - 来自 dplyr/tidyverse 的 Complete() 函数不适用于 Shiny 交互变量

r - 使用具有重复标识符的 data.frame/tibble 进行传播

r - 16 位以上整数的计算

r - spsample : Error in . local(x, n, type, ...) :迭代未收敛;尝试扩大参数 iter

r - 添加一个新列,将一个字符串映射到一个基于 "Rosetta Stone"数据框的新字符串?

r - 如何选择group_by后未汇总的列?

R:如何在列表中应用求和函数?