使用或运算符将Excel中的可选工作表读入R中

时间:2017-09-08 17:42:59

标签: r excel

我有一个包含数千个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开销限制的错误。

1 个答案:

答案 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)