r-markdown - динамический многострочный заголовок со второй строкой.

Я пытаюсь создать многострочный заголовок в r-markdown, но у меня возникают проблемы: 1.) сделать его динамическим и 2.) позволить второй строке заголовка быть таким же.

Например, в приведенном ниже наборе данных вы можете увидеть две группы: лепестки и перегородки. У каждого есть длина и ширина.

library(tidyverse)

data <- iris[c(1, 51, 101), ] %>% 
  gather(key = key, value = value, -Species) %>% 
  separate(col = key, into = c("Group", "key"), sep = "\\.") %>% 
  spread(key = key, value = value, )

data

#       Species      Group   Length Width
# 1     setosa       Petal   1.4    0.2
# 2     setosa       Sepal   5.1    3.5
# 3 versicolor       Petal   4.7    1.4
# 4 versicolor       Sepal   7.0    3.2
# 5  virginica       Petal   6.0    2.5
# 6  virginica       Sepal   6.3    3.3

Я хотел бы, чтобы в результате получился многострочный заголовок с группами по частям цветка (сгруппированные по уникальным значениям, какими бы они ни были), а также по длине и ширине во второй строке. Как показано ниже:

# --------------------------------------------
#            Petal            Sepal
# --------------------------------------------
# Species    Length  Width    Length    Width
# --------------------------------------------
# setosa     1.4     0.2      5.1       3.5
# versicolor 4.7     1.4      7         3.2
# virginica  6       2.5      6.3       3.3
# --------------------------------------------

Я экспериментировал с пакетами kable и flextable, но в примерах, похоже, жестко запрограммированы заголовки, которых я стараюсь избегать.


person alexb523    schedule 09.08.2019    source источник
comment
вы можете проверить formattable или kable в здесь   -  person akrun    schedule 09.08.2019


Ответы (1)


С flextable должно получиться что-то вроде этого:

library(tidyverse)
library(flextable)

data <- iris[c(1, 51, 101), ]

header_df <- tibble( key = colnames(data) ) %>% 
  separate(col = key, into = c("Group1", "Group2"), sep = "\\.", remove = FALSE, fill = "left")

data %>% 
  select(Species, everything()) %>% 
  flextable() %>% 
  set_header_df(mapping = header_df, key = "key") %>% 
  merge_h(part = "header") %>% 
  theme_booktabs()

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

person David Gohel    schedule 09.08.2019
comment
Спасибо, @ Дэвид Гохель. Думаю, я начинаю это понимать. Мне нужен ключ для столбцов. Если вы посмотрите, как структурирована «необработанная» выборка данных в примере, нужно ли мне вернуть ее к исходной форме iris (spetal.width и т. Д.)? Или есть другой способ перейти от того, как структурированы мои образцы данных (длина и ширина двух столбцов, а затем столбец группы), к тому, что вы предоставили? - person alexb523; 09.08.2019
comment
@ alexb523 flextable не будет реструктурировать ваш df, поэтому я предполагаю, что вы не можете сохранить его структурированным как data, вам нужно будет использовать data.table :: dcast (или tidyr :: spread), чтобы структурировать его для flextable. - person David Gohel; 09.08.2019
comment
есть ли хороший способ объединить Species (слово) для центрирования? - person alexb523; 09.08.2019
comment
да, см. ?flextable::align. Должно быть align(ft, j=1, align="center", part="header") - person David Gohel; 10.08.2019