我正在尝试合并/绑定大量数据。该代码已编写并且可以正常工作。尝试合并没有工作表的数据时出现问题。有什么方法可以跳过错误?
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中仅包含“ Sheet 1”和“ Sheet 3”,而不包含“ Sheet 2”。因此,这将为整个“ Sheet_2”数据帧引发错误。
答案 0 :(得分: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
。