Отформатируйте данные для создания аккуратной таблицы в R markdown с помощью kable

Я хочу создать аккуратную таблицу в R markdown с помощью пакета kable, но мои данные нужно преобразовать.

Мои данные выглядят так:

category <- c('population', 'population', 'sample', 'sample', 'population', 'population', 'sample', 'sample')
gender <- c('female', 'male', 'female', 'male', 'female', 'male', 'female', 'male')
n <- c(12,20,14,14,11,21,13,15)
frequency <- c(0.375, 0.625, 0.5, 0.5, 0.34375, 0.65625, 0.4642857, 0.5357143)
cohort <- c('one', 'one', 'one', 'one', 'two', 'two', 'two', 'two')

df <- data.frame(category, gender, n, frequency, cohort)

Я хотел бы создать таблицу в R markdown, которая выглядит так (но я приветствую другие предложения):

введите описание изображения здесь

Есть идеи, как это решить? Я ценю любую помощь!


person johnny    schedule 14.11.2020    source источник
comment
В этом случае вы можете попробовать kableExtra. Если есть что-то более конкретное, мешающее вам использовать kableExtra, спросите еще раз.   -  person rjen    schedule 14.11.2020


Ответы (1)


Как предлагает @rjen, пакет kableExtra может вам подойти. Ниже рабочий пример.

Сначала нужно поместить в широкий формат и упорядочить столбцы в соответствии с желаемой таблицей. Затем установите выравнивание на c (по центру) и скройте имена столбцов. Использование add_header_above даст вам трехуровневый заголовок. Используемые числа указывают ширину / диапазон заголовка относительно столбцов под ним.

library(tidyverse)
library(kableExtra)

df %>%
  pivot_wider(id_cols = cohort, names_from = c(category, gender), values_from = c(frequency, n)) %>%
  select(cohort, frequency_population_male, frequency_sample_male, frequency_population_female, frequency_sample_female,
         n_population_male, n_sample_male, n_population_female, n_sample_female) %>%
  mutate_if(is.numeric, format, digits=2) %>%
  kable(align = rep('c', 9), col.names = NULL) %>%
  kable_classic() %>%
  add_header_above(c("Cohort", rep(c("Population", "Sample"), 4))) %>%
  add_header_above(c(" ", "Male" = 2, "Female" = 2, "Male" = 2, "Female" = 2)) %>%
  add_header_above(c(" ", "Frequency" = 4, "N" = 4))

Вывод

введите описание изображения здесь

person Ben    schedule 15.11.2020