2

我正在编写一份报告,我必须将大量类似的数据框导出到 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()

这给了我一个嵌套数据框,我可以在flextableusing中应用函数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

在此处输入图像描述

4

1 回答 1

2

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)
  } )) 
于 2018-01-24T10:11:41.810 回答