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

时间:2017-10-03 15:50:23

标签: r purrr

require(purrr)
require(xlsx)

我正在Excel工作簿中阅读多张工作表。每个工作表都包含一个对象的数据,所以我试图读取所有工作表,应用几个转换,然后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)
}

获取工作表名称,然后使用lapply读取Excel工作表:

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)会抛出错误:

  

工作表[工作表]出错:无效的下标类型&#39; list&#39;

任何人都知道出了什么问题?

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

1 个答案:

答案 0 :(得分:0)

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

我定义了一个自定义的“read excel”函数,将工作表名称作为列添加到每个数据框中。

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

使用lapply阅读表格:

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

第二个问题似乎是在apply函数中使用dfTransform引起的。仅通过fieldnames创建valuesgsub向量就可以简化:

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

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