首页 > 解决方案 > R 官员 - 将数据框嵌套到分组列表中并将表导出到带有组标题的 Word

问题描述

我读了一个类似的问题,它帮助我达到了现在的目的,但我正在为下一步而苦苦挣扎。我有一个类似于下面的数据框 -

Product = c("Apple", "Apple", "Banana", "Banana", "Banana", "Carrot", 
            "Carrot") 
Category = c(1, 2, 1, 2, 3, 1, 2) 
Slope = c(2.988, 2.311, 2.181, 6.387, 2.615, 7.936, 3.267) 
df = data.frame(Product, Category, Slope) 

我的目标是为每个产品制作一个带有表格的 Word 报告。为此,我创建了一个包含数据和弹性表的列表,如下所示 -

library(tidyverse)
library(flextable)
library(officer)
test <- df %>%
          group_by(Product) %>%
          nest() %>%
          mutate(data$Product)
          mutate(ftables = map(data, flextable)) %>%
          mutate(ftables = map(ftables, ~ bg(.,
                               bg = '#bfbfbf',
                               part = 'header')))

然后我可以把它变成这样的词 -

my_doc <- read_docx()
for (i in seq_along(test$ftables)) {
     body_add_flextable(my_doc, test$ftables[[i]]) %>%
     body_add_par(value = "")
}

输出很好,但不幸的是,我失去了识别每个表属于哪个产品的任何方法。

我想将产品名称作为标题或在表格中。没关系,但我也不知道该怎么做。

我试图寻找在嵌套后重新引入分组字段的方法,并尝试在我的 for 循环中加倍标题,但最终只是重复每个标题下的所有表格 -

for (i in seq_along(test$ProductLine)) {
  my_doc <- body_add_par(my_doc, value = test$ProductLine[[i]], style = 
                         'heading 1') %>%
  body_add_par(value = "")
  for (j in seq_along(test$ftables)) {
    my_doc <- body_add_flextable(my_doc, test$ftables[[i]])
  }
}

有人知道我可以做到这一点的方法吗?

标签: rtidyrpurrrflextableofficer

解决方案


在您第二次尝试循环时,不要添加第一个循环,只需将命令添加到您的链中......

Product = c("Apple", "Apple", "Banana", "Banana", "Banana", "Carrot", 
            "Carrot") 
Category = c(1, 2, 1, 2, 3, 1, 2) 
Slope = c(2.988, 2.311, 2.181, 6.387, 2.615, 7.936, 3.267) 
df = data.frame(Product, Category, Slope) 

library(tidyverse)
library(flextable)
library(officer)

test <- 
  df %>%
  group_by(Product) %>%
  nest() %>%
  mutate(ftables = map(data, flextable)) %>%
  mutate(ftables = map(ftables, ~ bg(.,
                                     bg = '#bfbfbf',
                                     part = 'header')))

my_doc <- read_docx()

for (i in seq_along(test$Product)) {
  my_doc <- 
    my_doc %>% 
    body_add_par(value = test$Product[[i]], style = 'heading 1') %>% 
    body_add_par(value = "") %>% 
    body_add_flextable(test$ftables[[i]]) %>% 
    body_add_par(value = "")
}

print(my_doc, target = "my_doc.docx")

推荐阅读