как создать несколько книг с несколькими листами в каждой

#r

#r

Вопрос:

У меня есть коды для создания нескольких файлов Excel. Можно ли изменить его, чтобы я мог сначала создать несколько книг одновременно, а затем записать их в Excel с тем же именем?

Мои коды:

 library(tidyverse)
library(writexl)

lst1 <- list(data1 = mpg, data2 = mpg, data3 = mpg, `data4` = mpg)


IDlist <- mpg %>% pull(cyl) %>% unique

make_one_xlsx <- function(this_id){
    lst1 %>% map(~filter(., cyl == this_id)) %>% write_xlsx(paste0("ID_", this_id, ".xlsx"))
}

IDlist %>% map(make_one_xlsx)
 

Комментарии:

1. Кажется ненужным шагом для «предварительного создания» пустых файлов Excel. Вы не получаете доступ к данным и не записываете их непосредственно в ячейки, используя write_xlsx() , как при написании кода на VBA. Вы считываете информацию Excel в память R, вносите изменения в R, затем перезаписываете исходный файл Excel новым.

2. Мне нужно добавить сводный лист для каждого файла Excel. Я не знаю способа добавить его позже. Вот почему я хочу сначала использовать его как рабочую книгу, чтобы я мог добавлять страницы, а затем писать Excel позже.

Ответ №1:

Предполагая, что вы используете write_xlsx() из readxl пакета, вы можете передать список фреймов данных в качестве первого аргумента, который создаст каждый фрейм данных как отдельный лист. Функция также будет использовать имя этого списка в качестве имени отображаемого листа Excel.

 library(tidyverse)
library(writexl)

# with with some number of data frames
lst1 <- list(data1 = mpg, data2 = mpg, data3 = mpg, `data4` = mpg)

IDlist <- mpg %>% pull(cyl) %>% unique

make_one_xlsx <- function(this_id){
  # make an interim list full of the filtered data
  temp <- lst1 %>% map(~filter(.,cyl == this_id))
  # calculate the summary information and add it to the interim list
  # I have no idea what summary info you need, this is a placeholder
  temp[['Summary']] <- temp %>% map(~summarise_all(.,mean)) %>% bind_rows()
  # write list of data to Excel, the summary table is there now.
  write_xlsx(temp, paste0("ID_", this_id, ".xlsx"))
}

IDlist %>% map(make_one_xlsx)
 

Теперь вы можете создавать файлы Excel с нуля со всеми необходимыми вкладками.

Комментарии:

1. Спасибо за предложение. Мой случай более сложный. У меня есть список data.frame, мне нужно отфильтровать их по ID, чтобы я мог создать Excel для каждого идентификатора. В каждом Excel есть несколько листов. используя свои коды, я могу создать нужный файл, но мне также нужно добавить сводную страницу s к каждому файлу Excel, и я не знаю, как это сделать после того, как я уже вывел Excel. Вот почему я хочу создать книгу сейчас, а не Excel. Я обновил свои коды, чтобы показать вам данные и дополнительную информацию.

2. Если вы можете установить пакет (обычно требуются права администратора) xlsx , пакет имеет аналогичную функцию с большей гибкостью. У этого пакета write.xlsx() есть аргумент append=TRUE , который позволяет вам добавить лист в существующую книгу. Что-то вроде write.xlsx(summaryData, 'existingExcel.xlsx', sheetName='Summary', append=TRUE) . openxlsx Пакет обладает аналогичной, но более раздражающей функциональностью, если вы не можете приступить xlsx к установке.

3. например make_one_xlsx <- function(this_id){ lst1 %>% map(~filter(., cyl == this_id)) %>% write_xlsx(paste0("ID_", this_id, ".xlsx")) } , куда я могу добавить summary ? могу ли я сделать make_one_xlsx <- function(this_id){ lst1 %>% map(~filter(., cyl == this_id)) %>% write_xlsx(paste0("ID_", this_id, ".xlsx"))%>% write.xlsx(summaryData, paste0("ID_", this_id, ".xlsx")', sheetName='Summary', append=TRUE) }

4. Я не уверен, как вы summryData выглядите, но чтобы соответствовать вашему рабочему процессу, я бы добавил код, после lst1 %>% map(~filter(., cyl == this_id)) %>% write_xlsx(paste0("ID_", this_id, ".xlsx")) которого сначала вычисляет любую сводную информацию, которую вы хотите, и сохраняет ее как summaryData и затем write.xlsx(summaryData, paste0("ID_", this_id, ".xlsx")', sheetName='Summary', append=TRUE) . Вы могли бы сделать это намного проще, изменив функцию для вычисления сводной информации перед write.xlsx() . Я обновил свой предыдущий ответ примером.

5. Большое спасибо. На самом деле я хочу добавить легенду на странице сводки, которая включает гиперссылки на каждую вкладку. Может быть слишком сложно сделать. Есть предложения? Может быть, я мог бы создать data.frame для хранения информации и добавления в lst1?