Во вложенном фрейме данных передайте информацию из одного столбца списка в функцию, примененную в другом
Я работаю над отчетом, для которого мне нужно экспортировать большое количество похожих фреймов данных в красивые таблицы в Word. Моя цель - достичь этого за один раз, используя flextable
генерировать таблицы и purrr
/ tidyverse
применить все процедуры форматирования ко всем строкам во вложенном фрейме данных. Вот как выглядит мой фрейм данных:
df <- data.frame(school = c("A", "B", "A", "B", "A", "B"),
students = c(round(runif(6, 1, 10), 0)),
grade = c(1, 1, 2, 2, 3, 3))
Я хочу создать отдельные таблицы для всех групп в столбце "школа" и начать с использования nest()
функционировать в tidyr
,
list <- df %>%
group_by(school) %>%
nest()
Это дает мне вложенный фрейм данных, к которому я могу применить функции в flextable
с помощью purrr
:
list <- list %>%
mutate(ftables = map(data, flextable)) %>%
mutate(ftables = purrr::map(ftables, ~ set_header_labels(.,
students = "No of students",
grade = "Grade")))
Первый mutate
генерирует новый столбец с гибкими объектами для каждой школы, а второй mutate
применяет к таблице метки заголовков на основе имен столбцов, сохраненных в объекте.
Теперь моя цель - добавить еще один заголовок, основанный на названии школы. Это значение находится в столбце списка, озаглавленном school
, что по строкам соответствует таблицам, сгенерированным в столбце списка ftables
, Как я могу передать название школы add_header
функционировать в ftables
, с помощью purrr
или любая другая процедура?
Ожидаемый результат
Я смог добиться того, чего хочу для отдельных школ, с помощью этой процедуры (идентичные ячейки заголовка будут позже объединены):
school.name <- "A"
ftable.a <- df %>%
filter(school == "A") %>%
select(-school) %>%
flextable() %>%
set_header_labels(students = "No of students",
grade = "Grade") %>%
add_header(students = school.name,
grade = school.name)
ftable.a
1 ответ
Пакет purrr
предоставляет функцию map2, которую вы должны использовать:
library(flextable)
library(magrittr)
library(dplyr)
library(tidyr)
library(purrr)
df <- data.frame(school = c("A", "B", "A", "B", "A", "B"),
students = c(round(runif(6, 1, 10), 0)),
grade = c(1, 1, 2, 2, 3, 3))
byschool <- df %>%
group_by(school) %>%
nest()
byschool <- byschool %>%
mutate(ftables = map(data, flextable)) %>%
mutate(ftables = purrr::map(
ftables, ~ set_header_labels(.,
students = "No of students",
grade = "Grade"))) %>%
mutate(ftables = purrr::map2(ftables, school, function(ft, h){
add_header(ft, students = h, grade = h)
} ))