Сводные таблицы с использованием вложенных таблиц - PullRequest
2 голосов
/ 29 апреля 2019

Я пытаюсь сгенерировать таблицу сводной статистики, используя методы purrr / tibble.Я могу рассчитать среднее по группам (sd) и рассчитывать, используя следующее:

library(dplyr)
library(tidyr)
library(purrr)
library(tibble)

mtcars %>%
  gather(variable, value, -vs, -am) %>%
  group_by(vs, am, variable) %>% 
  nest() %>% 
  filter(variable %in% c("mpg", "hp")) %>% 
  mutate(
    mean = map_dbl(data, ~mean(.$value, na.rm = TRUE)),
    sd = map_dbl(data, ~sd(.$value, na.rm = TRUE)),
    n = map_dbl(data, ~sum(!is.na(.$value)))
  )  %>% 
  select(vs:variable, mean:n) %>% 
  mutate_at(vars(mean, sd), round, 3) %>% 
  mutate(mean_sd = paste0(mean, " (", sd, ")"),
         var_group = paste(vs, am, variable, sep = "_")) %>% 
  select(n:var_group) %>%
  nest(n, mean_sd, .key = "summary") %>% 
  spread(key = var_group, value = summary) %>% 
  unnest()

Мой непосредственный вопрос: как мне сохранить имена столбцов, как показано в spread(key = var_group, value = summary) в unnest()выход?

edit: Спасибо всем за ответы.https://stackoverflow.com/a/55912326/5745045 обладает тем преимуществом, что его легче читать и не хранить временную переменную.Недостатком является изменение цифры в символ в столбцах n.

Конечная цель - заменить имена столбцов форматированным текстом в контексте сгруппированной таблицы kable.

Ответы [ 2 ]

2 голосов
/ 29 апреля 2019

Сохраняя «вложенный» tibble в качестве временной переменной 1 и используя ее colnames 2 , мы можем достичь того, что вы желаете.Смотрите ниже;

mtcars %>%
  gather(variable, value, -vs, -am) %>%
  group_by(vs, am, variable) %>% 
  nest() %>% 
  filter(variable %in% c("mpg", "hp")) %>% 
  mutate(
    mean = map_dbl(data, ~mean(.$value, na.rm = TRUE)),
    sd = map_dbl(data, ~sd(.$value, na.rm = TRUE)),
    n = map_dbl(data, ~sum(!is.na(.$value)))
  )  %>% 
  select(vs:variable, mean:n) %>% 
  mutate_at(vars(mean, sd), round, 3) %>% 
  mutate(mean_sd = paste0(mean, " (", sd, ")"),
         var_group = paste(vs, am, variable, sep = "_")) %>% 
  select(n:var_group) %>%
  nest(n, mean_sd, .key = "summary") %>% 
  spread(key = var_group, value = summary) %>% 
  #1: storing the temporary nested variable
  {. ->> temptibble} %>%
  unnest() %>% 
  #2: renaming the columns of unnested output and removing temporary variable
  rename_all(funs(paste0(., "_", rep(colnames(temptibble), each=2)))); rm(temptibble)
# # A tibble: 1 x 16
#   n_0_0_hp   mean_sd_0_0_hp  n1_0_0_mpg  mean_sd1_0_0_mpg  n2_0_1_hp  mean_sd2_0_1_hp n3_0_1_mpg  mean_sd3_0_1_mpg
#   <dbl>      <chr>                <dbl>  <chr>                 <dbl>  <chr>                <dbl>  <chr>                
# 1       12  194.167 (33.36)          12     15.05 (2.774)          6 180.833 (98.816)          6     19.75 (4.009)
#    n4_1_0_hp   mean_sd4_1_0_hp n5_1_0_mpg  mean_sd5_1_0_mpg   n6_1_1_hp  mean_sd6_1_1_hp  n7_1_1_mpg  mean_sd7_1_1_mpg
#        <dbl>   <chr>                <dbl>  <chr>                  <dbl>  <chr>                 <dbl>  <chr>
# 1         7   102.143 (20.932)         7     20.743 (2.471)           7  80.571 (24.144)           7    28.371 (4.758)
1 голос
/ 30 апреля 2019

Вот еще один метод, который не требует создания временной переменной. Вместо того, чтобы вложить данные в конце, я использовал gather() и unite(), чтобы реструктурировать данные так, чтобы они оказались в виде одной пары ключ-значение.

library(tidyverse)
#> Registered S3 methods overwritten by 'ggplot2':
#>   method         from 
#>   [.quosures     rlang
#>   c.quosures     rlang
#>   print.quosures rlang
#> Registered S3 method overwritten by 'rvest':
#>   method            from
#>   read_xml.response xml2
mtcars %>%
  gather(variable, value, -vs, -am) %>%
  group_by(vs, am, variable) %>% 
  nest() %>% 
  filter(variable %in% c("mpg", "hp")) %>% 
  mutate(
    mean = map_dbl(data, ~mean(.$value, na.rm = TRUE)),
    sd = map_dbl(data, ~sd(.$value, na.rm = TRUE)),
    n = map_dbl(data, ~sum(!is.na(.$value)))
  )  %>% 
  select(vs:variable, mean:n) %>% 
  mutate_at(vars(mean, sd), round, 3) %>% 
  mutate(mean_sd = paste0(mean, " (", sd, ")"),
         var_group = paste(vs, am, variable, sep = "_")) %>% 
  select(n:var_group) %>% 
  gather(key, value, -var_group) %>% 
  unite(var_group_key, var_group, key) %>% 
  spread(var_group_key, value)
#> # A tibble: 1 x 16
#>   `0_0_hp_mean_sd` `0_0_hp_n` `0_0_mpg_mean_s… `0_0_mpg_n` `0_1_hp_mean_sd`
#>   <chr>            <chr>      <chr>            <chr>       <chr>           
#> 1 194.167 (33.36)  12         15.05 (2.774)    12          180.833 (98.816)
#> # … with 11 more variables: `0_1_hp_n` <chr>, `0_1_mpg_mean_sd` <chr>,
#> #   `0_1_mpg_n` <chr>, `1_0_hp_mean_sd` <chr>, `1_0_hp_n` <chr>,
#> #   `1_0_mpg_mean_sd` <chr>, `1_0_mpg_n` <chr>, `1_1_hp_mean_sd` <chr>,
#> #   `1_1_hp_n` <chr>, `1_1_mpg_mean_sd` <chr>, `1_1_mpg_n` <chr>

Создано в 2019-04-29 пакетом Представления (v0.2.1)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...