#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?