在嵌套数据框中,将信息从一个列表列传递到另一个应用的函数
In nested data frame, pass information from one list column to function applied in another
我正在处理一份报告,为此我必须将大量相似的数据框导出到 Word 中漂亮的 tables 中。我的目标是一次性实现这一目标,使用 flextable
生成 tables 并使用 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' 中的所有组生成单独的 table 并开始使用 tidyr
.
中的 nest()
函数
list <- df %>%
group_by(school) %>%
nest()
这给了我一个嵌套数据框,我可以使用 purrr
:
在 flextable
中应用函数
list <- list %>%
mutate(ftables = map(data, flextable)) %>%
mutate(ftables = purrr::map(ftables, ~ set_header_labels(.,
students = "No of students",
grade = "Grade")))
第一个 mutate
为每个学校生成一个带有 flextable objects 的新列,第二个 mutate
将 header 标签应用于table,基于object.
中保存的列名
我现在的目标是添加另一个基于学校名称的 header。此值驻留在标题为 school
的列表列中,它对应 row-wise 到列表列 ftables
中生成的 table。如何使用 purrr
或任何其他程序将学校名称传递给 ftables
中的 add_header
函数?
预期输出
通过此过程,我已经能够为各个学校实现我想要的(稍后将合并相同的 header 单元格):
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
包 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)
} ))
我正在处理一份报告,为此我必须将大量相似的数据框导出到 Word 中漂亮的 tables 中。我的目标是一次性实现这一目标,使用 flextable
生成 tables 并使用 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' 中的所有组生成单独的 table 并开始使用 tidyr
.
nest()
函数
list <- df %>%
group_by(school) %>%
nest()
这给了我一个嵌套数据框,我可以使用 purrr
:
flextable
中应用函数
list <- list %>%
mutate(ftables = map(data, flextable)) %>%
mutate(ftables = purrr::map(ftables, ~ set_header_labels(.,
students = "No of students",
grade = "Grade")))
第一个 mutate
为每个学校生成一个带有 flextable objects 的新列,第二个 mutate
将 header 标签应用于table,基于object.
我现在的目标是添加另一个基于学校名称的 header。此值驻留在标题为 school
的列表列中,它对应 row-wise 到列表列 ftables
中生成的 table。如何使用 purrr
或任何其他程序将学校名称传递给 ftables
中的 add_header
函数?
预期输出
通过此过程,我已经能够为各个学校实现我想要的(稍后将合并相同的 header 单元格):
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
包 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)
} ))