require(purrr)
require(xlsx)
我正在Excel工作簿中阅读多张工作表。每个工作表都包含一个对象的数据,所以我试图读取所有工作表,应用几个转换,然后rbind
将它们放在一起。
我为变换编写了这个辅助函数,所有数据都在一列中,所以我使用正则表达式分成fieldnames
和values
:
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;
任何人都知道出了什么问题?
我无法提供实际数据,因此对于这不是一个可重复的示例表示道歉。如果这还不足以解决问题,我可以尝试生成一些。
答案 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
创建values
和gsub
向量就可以简化:
fieldnames <- gsub("(^.*?):.*","\\1",sheet$X1)
values <- gsub("(^.*?:\\s)","",sheet$X1)
完成这些更改后,将fileList
传递给purrr::map(dfTransform)
会按预期执行。