使用地图将函数应用于 Excel 返回错误的工作表列表

Using map to apply functions to a list of Excel sheets returning an error

require(purrr)
require(xlsx)

我正在阅读一本包含许多 sheet 的 Excel 工作簿。每个 sheet 包含一个对象的数据,所以我试图读取所有 sheet ,应用几个转换,然后 rbind 它们一起。

我为转换编写了这个辅助函数,所有数据都在一列中,所以我使用正则表达式拆分为 fieldnamesvalues:

dfTransform <-function(sheet){
    fieldnames <- apply(sheet,2,function(x) gsub("(^.*?):.*","\1",x))
    values  <- apply(sheet,2,function(x) gsub("(^.*?:\s)","",x))
    df <- data.frame(fieldnames,values)
    df$name <- sheets[sheet]
    return(df)
}

获取 sheet 个名字,然后使用 lapply:

在 Excel sheet 中读入
wb <- loadWorkbook(path)

sheets <- names(getSheets(wb))

x <- lapply(sheets,function(x) read.xlsx("C://Users/591043/Desktop/EmployeeBGData.xlsx",x,header=F))

所以x是一个数据帧列表。

现在,我想从这里我可以简单地

x %>% map(dfTransform)
  %>% reduce(rbind)

但是 map(dfTransform) 抛出错误:

Error in sheets[sheet] : invalid subscript type 'list'

有人知道出了什么问题吗?

我无法提供实际数据,因此很抱歉这不是一个可重现的示例。如果这还不足以解决问题,我可以尝试生成一些。

解决方案有几个部分,首先,我意识到我需要在读取文件时将 sheet 名称分配给数据帧列表。

我定义了一个自定义 "read excel" 函数来将 sheet 名称作为列添加到每个数据框。

readXLfile <- function(x){
    xlfile <-  read.xlsx("path",x,header=F)
    xlfile$name <- x
    return(xlffile)
}

使用 lapply 读入 sheets:

fileList <- lapply(sheets, function(x) readXLfile(x))

第二个问题似乎是在dfTransform函数中使用了apply引起的。我通过仅使用 gsub 创建 fieldnamesvalues 向量来简化:

fieldnames <- gsub("(^.*?):.*","\1",sheet$X1)
values  <- gsub("(^.*?:\s)","",sheet$X1)

进行这些更改后,将 fileList 传递给 purrr::map(dfTransform) 按预期执行。