#r #excel #automation
#r #excel #автоматизация
Вопрос:
Я пытаюсь объединить / связать огромный набор данных. Код для этого написан и работает нормально. Проблема возникает при попытке объединить данные, в которых отсутствует лист. Есть ли какие-либо способы, с помощью которых я могу пропустить ошибку?
library(tidyverse)
library(xlsx)
files <- list.files(pattern="*.xlsx")
read_Sheet_1 <- lapply(files, readxl::read_excel, sheet = "Sheet 1")
Sheet_1 = do.call(rbind, read_Sheet_1)
read_Sheet_2 <- lapply(files, readxl::read_excel, sheet = "Sheet 2")
Sheet_2 = do.call(rbind, read_Sheet_2)
read_Sheet_3 <- lapply(files, readxl::read_excel, sheet = "Sheet 3")
Sheet_3 = do.call(rbind, read_Sheet_3)
write.xlsx(as.data.frame(Sheet_1), file="Final.xlsx", sheetName="Sheet_1", row.names=FALSE)
write.xlsx(as.data.frame(Sheet_2), file="Final.xlsx", sheetName="Sheet_2", append=TRUE, row.names=FALSE)
write.xlsx(as.data.frame(Sheet_3), file="Final.xlsx", sheetName="Sheet_3", append=TRUE, row.names=FALSE)
Ожидаемый результат: объединенные строки из каждого листа в один Final.xlsx файл
Фактический результат: несмотря на то, что функции объединяют строки вместе. Ошибка возникает, если в одном из файлов всего 2 листа. Пример: File3.xlsx содержит только «Лист 1» и «Лист 3», а не «Лист 2». Таким образом, это приведет к возникновению ошибки для всего фрейма данных «Sheet_2».
Ответ №1:
Вы можете использовать safely
из purrr
пакета:
library(tidyverse)
library(xlsx)
files <- list.files(pattern="*.xlsx")
read_excel_safe <- function(file, sheet) {
read_excel_safely <- safely(readxl::read_excel, otherwise = NULL)
read_excel_safely(file, sheet = sheet)$result
}
Sheet_1 <- files %>%
map(.f = read_excel_safe, sheet = 'Sheet 1') %>%
reduce(rbind)
Функция read_excel_safely
вернет именованный список с ошибкой и результатами. Если есть ошибка, результатом будет NULL
. И это должно повлиять на rbind
при выполнении этого шага сокращения.