R officer - Nest Dataframe Into Grouped List And Export Tables to Word With Group Headers

跟風遠走 提交于 2019-12-11 15:14:34

问题


I read a similar question that helped me get to the point I'm at now, but am struggling with the next step. I have a dataframe similar to below -

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) 

My objective is to have a Word report with a table for each product. To do this, I create a list with the data and flextables, as below -

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')))

I can then pass this into word like this -

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

The output is great, but unfortunately I lose any method of identifying which product each table belongs to.

I would either like to have the Product name as a title or within the tables. Doesn't matter which, but I can't figure out how to do either.

I've tried to look for ways to reintroduce the grouped field post-nest and also tried doubling up on my for loop for the headers, but ended up just repeating all the tables under each header -

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

Does anybody know a way that I can accomplish this?


回答1:


in your second try of a loop, don't add the first loop, just add the command to your chain...

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")


来源:https://stackoverflow.com/questions/50568695/r-officer-nest-dataframe-into-grouped-list-and-export-tables-to-word-with-grou

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!