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

时间:2020-05-27 11:40:46

标签: 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

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

3 个答案:

答案 0 :(得分:4)

不是一个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

答案 1 :(得分:4)

您可以使用ColorDialog1中的pivot_wider跳过".value"步骤。

names_to

答案 2 :(得分:2)

您可以先将所有列堆叠在一起,然后按组进行汇总。

dat %>%
  pivot_longer(everything()) %>%
  group_by(name) %>% 
  summarise_at("value", list(~mean(.), ~sum(.)))

# # A tibble: 5 x 3
#   name   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
相关问题