我有一个包含数千个Excel工作簿(.xlsx)的文件夹。一半工作簿有一张名为Data
的工作表,一半工作表有一张名为Changes
的工作表。这两个表都包含相同类型的信息,它们只是标记不同。没有理由或命令将某些内容标记为Changes
和其他Data
。
目前,我使用此代码阅读所有工作表
myfiles <- list()
temp = list.files(pattern="*.xls")
myfiles = lapply(temp, function(x){as.data.frame(read_excel(x,sheet =
"Data"))})
但这只会在Data
指定的表格中读取。
我想做的是:
myfiles = lapply(temp, function(x){as.data.frame(read_excel(x,sheet =
"Changes" || sheet = "Data"))})
如果我尝试使用
加载所有工作簿myfiles = lapply(temp, function(x){loadworkbook(x)})
我收到有关超出GC开销限制的错误。
答案 0 :(得分:1)
我不确定你是否可以通过这种方式将or
语句传递给参数。一种解决方案是读取工作表名称,搜索"data"
,如果存在,请阅读"data"
表,如果没有,请阅读"changes"
表。在这里,我定义了一个函数read_excel_if
,对单个文件执行此检查,然后我map
将此函数添加到temp
变量中的所有文件,然后reduce
将所有文件转换为使用bind_rows
的单个数据框 - 如果您只想要一个dataframes
列表,请跳过此步骤。
library(readxl)
library(purrr)
library(dplyr)
read_excel_if <- function(file_path) {
sheets <- excel_sheets(file_path)
if ("data" %in% sheets) {
df <- read_excel(file_path, sheet = "data")
} else {
df <- read_excel(file_path, sheet = "changes")
}
df
}
temp %>% map(read_excel_if) %>% reduce(bind_rows)