Чтение нескольких файлов xlsx с несколькими листами в один фрейм данных R - проблема с функцией set_names - PullRequest
0 голосов
/ 12 июня 2019

Я бы хотел, чтобы R читал в нескольких файлах xlsx, которые имеют несколько листов, у меня есть заголовок (colnames) для первого листа каждого файла, но у меня его нет для остальных листов, однако это точно такие же столбцы.

Я нашел это решение в сообщении:

dir_path <- "~/test_dir/"         # target directory path where the xlsx files are located. 
re_file <- "^test[0-9]\\.xlsx"    # regex pattern to match the file name format, in this case 'test1.xlsx', 'test2.xlsx' etc, but could simply be 'xlsx'.

read_sheets <- function(dir_path, file){
  xlsx_file <- paste0(dir_path, file)
  xlsx_file %>%
    excel_sheets() %>%
    set_names() %>%
    map_df(read_excel, path = xlsx_file, .id = 'sheet_name') %>% 
    mutate(file_name = file) %>% 
    select(file_name, sheet_name, everything())
}

df <- list.files(dir_path, re_file) %>% 
  map_df(~ read_sheets(dir_path, .))

но я не могу понять, почему это не сработает, я получаю эту ошибку.

Ошибка в set_names (.): 1 аргумент передан 'names <-', что требует 2 </p>

Спасибо заранее

Ответы [ 2 ]

0 голосов
/ 13 июля 2019

Это похоже на работу.Вот другое средство для достижения той же цели.

library(XLConnect)

testDir <- "C:\\your_path_here\\"

re_file <- ".+\\.xls.?"
testFiles <- list.files(testDir, re_file, full.names = TRUE)

# This function rbinds in a single dataframe
# the content of multiple sheets in the same workbook
# (assuming that all the sheets have the same column types)
rbindAllSheets <- function(file) {
  wb <- loadWorkbook(file)
  sheets <- getSheets(wb)
  do.call(rbind,
          lapply(sheets, function(sheet) {
            readWorksheet(wb, sheet)
          })
  )
}

# Getting a single dataframe for all the Excel files
result <- do.call(rbind, lapply(testFiles, rbindAllSheets))
0 голосов
/ 12 июня 2019

Я создал это readxl решение с двумя рабочими книгами Excel, каждая из которых имеет 2 листа с одинаковыми столбцами.В вашей задаче 2-й лист (и далее) не имеет colnames, поэтому их нужно было установить с дополнительным оператором if.Возможно, это не самое быстрое решение, но оно работает:

library(readxl)    

#Set path
inputFolder <- "test/"

#Get list of files
fileList <- list.files(path = inputFolder, recursive=T, pattern='*.xlsx')

#Read in each sheet from each excel
for (f in 1:length(fileList)){
  #Find the number of sheets in this workbook
  sheetList <- excel_sheets(paste(inputFolder, fileList[f], sep = ""))
  #Get the sheets of this workbook
  for (s in 1:length(sheetList)) {
    tempSheet <- read_excel(paste(inputFolder, fileList[f], sep = ""), sheet = sheetList[s])
    if (f == 1 & s == 1) {
      df <- tempSheet
    }
    else {
      if(s != 1) {
        names(tempSheet) <- names(df)
      }
      df <- rbind(df,tempSheet)
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...