tidyverse суммирует несколько столбцов, но показывает результат в виде строк - PullRequest
3 голосов
/ 27 мая 2020

У меня есть данные, по которым я хочу получить кучу сводной статистики для нескольких столбцов с помощью подхода tidyverse. Однако, используя функцию tidyverse summarize, он создаст каждый столбец statisti c как новый столбец, тогда как я бы предпочел видеть имена столбцов в виде строк, а каждый statisti c как новый столбец. Итак, мой вопрос:

Есть ли более элегантный (и я знаю, что «элегантный» - расплывчатый термин) способ добиться этого, чем добавление к функции summarize pivot_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")

Ожидаемый результат:

# 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

Примечание: я не указываю имя любого из столбцов, поэтому, если есть хороший способ получить структуру таблицы с разными / generi c именами, это тоже будет хорошо.

Ответы [ 3 ]

4 голосов
/ 27 мая 2020

не решение tidyverse, а data.table вместо этого ... также не уверен, что оно более 'элегантное'; -)

но здесь вы go ...

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
3 голосов
/ 27 мая 2020

Вы можете пропустить шаг pivot_wider, используя ".value" в 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
2 голосов
/ 27 мая 2020

Сначала вы можете сложить все столбцы вместе и суммировать по группам.

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
...