合并同名工作表 跳过没有该工作表的文件并添加具有文件名的列

  • 本文关键字:工作 添加 文件名 文件 合并 r
  • 更新时间 :
  • 英文 :


我对R很陌生,所以如果我的问题对你来说很愚蠢,请不要生气:)

基本上,我在一个文件夹中有不同的.xlsx文件,它们在工作表方面具有相同的结构,但在某些情况下,相同的工作表并不存在于所有文件中。

当工作表始终存在时,我运行下面的代码,添加一个带有文件名的列:

library(readxl)
library(tidyr)
myfiles<-list.files(pattern = "*.xlsx")
myfiles
test = lapply (myfiles, function(i){
x = read_excel(i, sheet='sheet_1')  
x$file = i
x
})

当所有文件中都不存在工作表时,上述代码不起作用,检测由于缺少工作表而导致的错误。我运行下面的代码,但是我不能像上面那样添加带有文件名的列。

library(readxl)
library(tidyr)
all_files <- list.files(pattern = '*.xlsx')
result <- lapply(all_files, function(x) {
all_sheets <- excel_sheets(x)  
correct_sheet <- intersect(all_sheets, c('Sheet_2’)
if(length(correct_sheet)) read.xlsx(x,correct_sheet)
})
prova<-do.call(rbind, result)
有人能帮帮我吗??提前感谢!

您可以试试try()

library(readxl)
library(tidyr)

myfiles<-list.files(pattern = "*.xlsx")
test = lapply (myfiles, function(i) try({
x = read_excel(i, sheet='sheet_1')  
x$file = i
x
},silent=TRUE))

这里使用try()函数是因为它可以阻止代码在遇到错误时退出并抛出错误。它会浏览文件,然后"尝试"做你想做的事。我使用silent=TRUE时,我不想要的错误日志,你得到,如果你接受默认设置。

从那里,您将看到您的列表有一些带有错误相关文本的古怪项目,而且您指定的工作表中的数据正在通过。如果您只想从已成功提取数据的工作表中获取数据,则可以执行以下操作:
test<-Filter(function(x) is.tbl(x),test)

您在这里所做的是利用Filter()函数,并过滤test,以便仅保留从excel文件中的工作表中提取的标题。

可选地,如果您想将所有数据放入单个标题中,我建议使用bind_rows()

test<-bind_rows(test)

最新更新