Офицер R - Вложите Dataframe в сгруппированный список и экспортируйте таблицы в Word с заголовками группы - PullRequest
0 голосов
/ 28 мая 2018

Я прочитал похожий вопрос, который помог мне добраться до той точки, в которой я сейчас нахожусь, но я борюсь со следующим шагом.У меня есть дата-кадр, аналогичный приведенному ниже -

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 с таблицей для каждого продукта. Для этого я создаю список с данными иflextables, как показано ниже -

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

Кто-нибудь знает способ, которым я могу это сделать?

1 Ответ

0 голосов
/ 28 мая 2018

во второй попытке цикла, не добавляйте первый цикл, просто добавьте команду в свою цепочку ...

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