我对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)