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

#r #r-markdown #kable #stargazer

#r #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, которая выглядит следующим образом (но я приветствую другие предложения):

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

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

Комментарии:

1. В этом случае вы можете попробовать kableExtra. Если есть что-то более конкретное, что мешает вам использовать kableExtra, пожалуйста, спросите еще раз.

Ответ №1:

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

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

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

Вывод

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