Добавьте несколько листов из нескольких файлов Excel в R

#r #excel #append

Вопрос:

Я пытаюсь добавить несколько листов из нескольких файлов Excel. Например, каждый файл Excel содержит 10 листов (разного формата), но 10 листов файла Excel имеют те же имена и формат, что и связанные 10 листов другого файла Excel. По сути, каждый файл Excel содержит различные типы информации о разных странах, но типы собираемой информации одинаковы для каждой страны (население, индекс загрязнения, ВВП и т.д.). И у меня много стран, поэтому я подумываю об использовании цикла.

Я использую «report_1h» в качестве основного файла Excel и добавляю листы других файлов Excel в листы основного файла.

 library(rio)

x1_data <- import_list("report_1h.xlsx")

report_list <- list.files(path = 'E:/Report_folder', pattern = '*.xlsx')

sheet_ <- data.frame()

for (file in report_list){
  book <- import_list(file)
  for (i in 1:31){
  sheet_[i] <- rbind(x1_data[[i]][,],book[[i]][,])
  x1_data[[i]][,] <- sheet_[i]
  }
}
 

Цикл предназначен для добавления листов из каждого файла Excel к листам основного файла «report_1h». Но это дает ошибку:

 Error in `[<-.data.frame`(`*tmp*`, i, value = c("Data Source(s):", "Data Source(s):",  : 
  replacement has 2 rows, data has 0
 

Может кто-нибудь сказать мне, почему?

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

1. Извините, в каждом файле Excel 31 лист, а не 10 листов.

2. Итак, если у вас есть 10 файлов Excel, каждый из которых содержит 31 лист. Вы хотите объединить все листы 1 из 10 файлов в одном кадре данных, затем 10 файлов из листа 2 в другом, и аналогично у вас будет 31 кадр данных в конце?

3. Да, я хочу объединить все листы 1 из всех 10 файлов Excel вместе, все листы 2 из всех 10 файлов Excel. Так что в итоге у меня 31 кадр данных!

Ответ №1:

Вот способ сделать это —

 library(tidyverse)

#get the all the filenames
report_list <- list.files(path = 'E:/Report_folder', pattern = '*.xlsx


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

1. Спасибо, я скоро попробую!

)

#Create a list of dataframes
map(report_list, function(x) {
sheets <-excel_sheets(x)
map(sheets, function(y) read_excel(x, y))
}) %>% transpose() %>%
map(bind_rows) -> result

#assign sheet names
names(result) <- paste0('Sheet', seq_along(result))

#Write master excel file
writexl::write_xlsx(result, 'master_excel.xlsx')

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

1. Спасибо, я скоро попробую!