Создание списка списков со сводной статистикой для ввода в summary_table () в R - PullRequest
0 голосов
/ 03 мая 2020

Я следую инструкциям здесь , чтобы создать чистую таблицу сводной статистики.

В этих инструкциях входные данные для функции summary_table () представляют собой список списков, как показано здесь:

our_summary1 <-
  list("Miles Per Gallon" =
   list("min" = ~ min(.data$mpg),
        "max" = ~ max(.data$mpg),
        "mean (sd)" = ~ qwraps2::mean_sd(.data$mpg)),
   "Displacement" =
   list("min" = ~ min(.data$disp),
        "median" = ~ median(.data$disp),
        "max" = ~ max(.data$disp),
        "mean (sd)" = ~ qwraps2::mean_sd(.data$disp)),
   "Weight (1000 lbs)" =
   list("min" = ~ min(.data$wt),
        "max" = ~ max(.data$wt),
        "mean (sd)" = ~ qwraps2::mean_sd(.data$wt)),
   "Forward Gears" =
   list("Three" = ~ qwraps2::n_perc0(.data$gear == 3),
        "Four"  = ~ qwraps2::n_perc0(.data$gear == 4),
        "Five"  = ~ qwraps2::n_perc0(.data$gear == 5))
   )

У меня есть 48 переменных в моем наборе данных, и каждая переменная имеет свой собственная колонка. Есть ли более чистый способ циклически перебирать все столбцы в моем фрейме данных, чтобы создать объект, подобный приведенному выше, не печатая его вручную, как это? В идеале я бы предпочел решение с использованием Tidyverse.

Одна вещь, которую я собирался сделать, это изменить мои данные на длинный формат, затем с помощью group_by () сгруппировать по каждому столбцу исходные данные, а затем с помощью summaze (). Тем не менее, я понимаю, что это приведет к одному списку, а не список списков, как это необходимо для summary_table ().

Если существует совершенно другой способ создания сводной таблицы, чем то, что я пытаюсь сделать здесь, пожалуйста, дайте мне знать. Этот вариант выглядел как самый лучший из рассматриваемых мной вариантов. Для каждой переменной я хотел бы иметь возможность переименовать ее и включить минимальное значение, максимальное значение, среднее значение и стандартное отклонение.

Ответы [ 2 ]

3 голосов
/ 03 мая 2020

Как вы заметили, вы можете перевести свои данные в более длинный формат и использовать summarize(). Хитрость заключается в том, чтобы создать столбец списка внутри каждой сводки:

library(dplyr)
library(tidyr)

summarized <- mtcars %>%
  pivot_longer(cols = c(mpg, wt, disp)) %>%
  group_by(name) %>%
  summarize(lst = list(list(mean = mean(value),
                            max = max(value),
                            min = min(value),
                            sd = sd(value))))

summarized
#> # A tibble: 3 x 2
#>   name  lst             
#> * <chr> <list>          
#> 1 disp  <named list [4]>
#> 2 mpg   <named list [4]>
#> 3 wt    <named list [4]>

Затем его можно превратить в список списков с помощью deframe() из пакета tibble.

library(tibble)
result <- deframe(summarized)

str(result)
#> List of 3
#>  $ disp:List of 4
#>   ..$ mean: num 231
#>   ..$ max : num 472
#>   ..$ min : num 71.1
#>   ..$ sd  : num 124
#>  $ mpg :List of 4
#>   ..$ mean: num 20.1
#>   ..$ max : num 33.9
#>   ..$ min : num 10.4
#>   ..$ sd  : num 6.03
#>  $ wt  :List of 4
#>   ..$ mean: num 3.22
#>   ..$ max : num 5.42
#>   ..$ min : num 1.51
#>   ..$ sd  : num 0.978
1 голос
/ 03 мая 2020

Отличное решение от Дэвида (одобрено)! И так как я быстро набрал простое решение, используя lapply, здесь вам поиграться:

library(magrittr)
library(qwraps2)
df = data.frame(matrix(rnorm(40), nrow=10))
df

xlist <- function(x)
  { list(
  "min" = min(x),
  "max" = max(x),
  "mean (sd)" = mean_sd(x))}

attach(df)
Smry <- lapply(1:4,FUN=xlist)
Smry

Просто отформатируйте вывод списка так, как вам нравится, в функции - клавиша здесь 1 ) Сделать функцию и 2) Использовать lapply

...