在嵌套数据框架中,将信息从一个列表列传递到另一个列表列中应用的函数

时间:2018-01-24 08:54:33

标签: r nested tidyverse purrr flextable

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

我想为“school”列中的所有群组生成单独的表格,并使用nest()中的tidyr函数启动。

list <- df %>% 
        group_by(school) %>%
        nest()

这为我提供了一个嵌套数据框,我可以使用flextablepurrr中应用这些函数:

list <- list %>% 
        mutate(ftables = map(data, flextable)) %>%
        mutate(ftables = purrr::map(ftables, ~ set_header_labels(.,
                                               students = "No of students",
                                               grade = "Grade")))

第一个mutate为每个学校生成一个包含flextable对象的新列,第二个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 功能?

预期输出
我已经能够通过这个程序实现我想要的个别学校(相同的标题单元格将在以后合并):

(new Model())->myFunction();

enter image description here

1 个答案:

答案 0 :(得分:2)

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