我正在尝试将大型xlsx文件导入到包含多张数据的R中。我试图通过XLConnect
执行此操作,但java内存问题(例如in this thread所述的问题阻止了此技术的成功。)
相反,我正在尝试使用openxlsx
包,我读过的包工作速度更快,完全避免使用Java。但有没有办法在循环中使用其read.xlsx
函数将所有工作表读入单独的数据框?我与其他软件包一起使用的技术不再有效,不再使用loadWorkbook()
和getSheets()
这样的bc命令。
感谢您的帮助。
答案 0 :(得分:4)
只需仔细阅读 openxlsx 的文档,就可以快速找到函数sheets()
,它所声明的函数已被弃用,而不是names()
,它返回所有名称工作簿中的工作表。然后,您可以在一个简单的for
循环中迭代它们。
我不确定你为什么说不能使用loadWorkbook
。同样,文档清楚地显示了该名称中 openxlsx 中的函数与 XLConnect 中的函数大致相同,尽管它的参数略有不同。
您还可以查看 readxl 包,该包也没有Java依赖关系。
答案 1 :(得分:0)
我认为getSheetNames()
函数是使用的正确函数。它将为您提供文件中工作表名称的向量。然后,您可以遍历此列表以读取data.frames列表。
read_all_sheets = function(xlsxFile, ...) {
sheet_names = openxlsx::getSheetNames(xlsxFile)
sheet_list = as.list(rep(NA, length(sheet_names)))
names(sheet_list) = sheet_names
for (sn in sheet_names) {
sheet_list[[sn]] = openxlsx::read.xlsx(xlsxFile, sheet=sn, ...)
}
return(sheet_list)
}
read_all_sheets(myxlsxFile)
答案 2 :(得分:-1)
'sapply'也可以使用。
read_all_sheets = function(xlsxFile, ...) {
sheet_names = openxlsx::getSheetNames(xlsxFile)
sheet_list = sapply(sheet_names, function(sn){openxlsx::read.xlsx(xlsxFile, sheet=sn, ...)}, USE.NAMES = TRUE)
return(sheet_list)
}