преобразование вывода dplyr для форматирования PDF с заголовками - PullRequest
0 голосов
/ 11 октября 2018

Я использую ноутбук Rstudio.Я создал вывод суммирования dplyr, и я хотел бы преобразовать его теперь в более читаемый вывод:

df %>%
  group_by(y) %>%
  dplyr::summarise_all(funs(count = n(),
                           mean = mean, 
                           stdev = sd, 
                           min = min, 
                           max = max, 
                           median = median,
                           iqr = IQR,
                           q25 = quantile(., probs = 0.25),
                           q75 = quantile(., probs = 0.75)
                       ))

вывод, я получаю что-то вроде этого:

y   x1_count    x2_count    x3_count    x1_mean x2_mean x3_mean
0   380081       380081      380081       10       12     36
1   19906         19906       19906        5        8     93

мой вопросявляется: как я могу преобразовать это в:

        count           mean    
    y = 0   y = 1   y = 0   y = 1
x1  380081  19906    10       5
x2  380081  19906    12       8
x3  380081  19906    36      93

Я пытался транспонировать, но не получил результат, который я хотел вообще.

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Как я уже отмечал в своем комментарии, это действительно вопрос, состоящий из двух частей: один касается преобразования данных, но суть его заключается в форматировании с заголовками для вывода в формате PDF.Нужный вывод - это не то, чего вы обычно добиваетесь в R - вы пытаетесь получить повторяющиеся имена столбцов, а затем заголовки над ними.Так что это проблема RMarkdown, поскольку вы пытаетесь связать PDF-файл в этом нестандартном формате.

Первая часть - это изменение формы.Вы можете сделать это, приведя данные в длинную форму, разделив x1_count и т. Д. На x1 и count с separate.Затем вы можете пометить как y = 0 с помощью mutate и paste, unite, чтобы соединить эти значения, чтобы получить имена столбцов, такие как count_y = 0, а затем вернуть его в широкий формат, как показано ниже.

library(tidyverse)

df %>%
  gather(key = x_measure, value = val, -y) %>%
  separate(x_measure, into = c("x", "measure"), sep = "_") %>%
  mutate(y = paste("y =", y)) %>%
  unite(key, measure, y) %>%
  spread(key = key, value = val)
#> # A tibble: 3 x 5
#>   x     `count_y = 0` `count_y = 1` `mean_y = 0` `mean_y = 1`
#>   <chr>         <int>         <int>        <int>        <int>
#> 1 x1           380081         19906           10            5
#> 2 x2           380081         19906           12            8
#> 3 x3           380081         19906           36           93

Вторая часть - подготовка к вязанию.Существует несколько пакетов, которые позволяют создавать такие печатные таблицы - я больше всего знаком с kableExtra, но есть также huxtable, xtable и, вероятно,несколько других.Вот фрагмент RMarkdown, который я использовал бы для этого с kableExtra.

. Я использую rename_all и str_remove, чтобы избавиться от битов, подобных count_ в count_y = 0.Чтобы изменить форму, мне все еще нужен был способ сохранить имена столбцов уникальными, но теперь я могу отбросить эти части имен.

Затем kableExtra::kable_styling и kableExtra::add_header_above позволяют печатать со вторым уровнемзаголовки.Я бы порекомендовал пройтись по виньеткам , потому что они очень тщательные.

---
title: "Table with headings"
output: pdf_document
---

```{r echo=FALSE, message=FALSE, warning=FALSE}
library(tidyverse)
library(knitr)
library(kableExtra)

df %>%
  gather(key = x_measure, value = val, -y) %>%
  separate(x_measure, into = c("x", "measure"), sep = "_") %>%
  mutate(y = paste("y =", y)) %>%
  unite(key, measure, y) %>%
  spread(key = key, value = val) %>%
  rename_all(str_remove, "^[a-z]+_") %>%
  kable(booktabs = T) %>%
  kable_styling() %>%
  add_header_above(c(" " = 1, "count" = 2, "mean" = 2))
```

Вязание этого дает PDF с:

enter image description here

0 голосов
/ 11 октября 2018

Вот один из вариантов:

df = read.table(text = "
y   x1_count    x2_count    x3_count    x1_mean x2_mean x3_mean
0   380081       380081      380081       10       12     36
1   19906         19906       19906        5        8     93
", header=T)

library(tidyverse)

df %>%
  gather(col,value,-y) %>%
  separate(col, c("x","metric")) %>%
  mutate(metric = paste0(metric, " for y = ", y)) %>%
  select(-y) %>%
  spread(metric, value)

#    x count for y = 0 count for y = 1 mean for y = 0 mean for y = 1
# 1 x1          380081           19906             10              5
# 2 x2          380081           19906             12              8
# 3 x3          380081           19906             36             93
...