Во вложенном фрейме данных передайте информацию из одного столбца списка в функцию, примененную в другом

Я работаю над отчетом, для которого мне нужно экспортировать большое количество похожих фреймов данных в красивые таблицы в 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)
  } )) 
Другие вопросы по тегам