将xlsx电子表格读入R时如何包含空列?

我正在尝试编写一个R脚本,它将循环访问大约100个小型Excel电子表格,并将具有完整单元格的15-20行(确切的行数在每个小文件中变化)整合为一个。

我正在使用的代码(包含在循环中)读取文件,但不包含任何条目的列将被跳过。

newDf <- read.xlsx(filename,sheetName="Coding",header=FALSE, rowIndex=rows,colIndex=columns) 

我目前的解决方法是创build一个虚拟的第一个数据框在每列中的值; 当我然后把每个新的DF都绑定到它时,这些列被强制排队。 但我希望有一个更好的方法。

任何帮助,将不胜感激。 谢谢。

如果您愿意使用XLConnect包而不是xlsx ,函数XLConnect::readWorksheet允许您指定startColendColautofitCol参数,这将为您解决此问题:

 library(XLConnect) ## # wb1 <- loadWorkbook("~/tmp/tmp1.xlsx", create = FALSE) # wb2 <- loadWorkbook("~/tmp/tmp2.xlsx", create = FALSE) df1 <- readWorksheet( object = wb1, sheet = "sheet1", startCol = 1, endCol = 3, autofitCol = FALSE) ## df2 <- readWorksheet( object = wb2, sheet = "sheet1", startCol = 1, endCol = 3, autofitCol = FALSE) ## R> head(df1,3) AB Col3 1 1 6 NA 2 2 7 NA 3 3 8 NA R> head(df2,3) ABC 1 1 6 11 2 2 7 12 3 3 8 13 

其中df1是从只包含两个非空列的工作表中读取的(请参阅下面的数据)。


数据:

 wb1 <- loadWorkbook("~/tmp/tmp1.xlsx", create = TRUE) createSheet(wb1, "sheet1") writeWorksheet( object = wb1, data = data.frame( A = 1:5, B = 6:10), sheet = "sheet1") saveWorkbook(wb1) ## wb2 <- loadWorkbook("~/tmp/tmp2.xlsx", create = TRUE) createSheet(wb2, "sheet1") writeWorksheet( object = wb2, data = data.frame( A = 1:5, B = 6:10, C = 11:15), sheet = "sheet1") saveWorkbook(wb2) 

我不知道为什么read.xlsx有这种行为…

有几个可能的解决scheme。 首先是使用XLSX包中的readColumns函数,而不是read.xlsx:

 wb <- loadWorkbook("c:/path/to/your/xlsx/file") sheets <- getSheets(wb) sheet <- sheets[["NAMEOFSHEET"]] newDf <- readColumns(sheet, startColumn=1, endColumn=3, startRow=1, endRow=4) 

或者,您可以继续阅读文件,使用read.xlsx,然后在以后添加空白列:

 if("COLUMN_THAT_SHOULD_BE_THERE" %in% colnames(newDf) == FALSE){ newDf$COLUMN_THAT_SHOULD_BE_THERE <- NA } 

也许尝试使用read.xlsx2

我用这种格式保存了一个Excel文件,并命名为test.xlsx

  id blank names 1: 1 John 2: 2 Jacob 3: 3 Jingel 4: 4 Heimer 5: 5 Schmidt 6: 6 Joe 7: 7 Public 8: 8 Jane 9: 9 Doe 10: 10 Ramsey 

而另一个我只是删除了列标题,我命名test2.xlsx

  id names 1: 1 John 2: 2 Jacob 3: 3 Jingel 4: 4 Heimer 5: 5 Schmidt 6: 6 Joe 7: 7 Public 8: 8 Jane 9: 9 Doe 10: 10 Ramsey 

当我用read.xlsx读取它们时, 只有当它没有被命名时, blank read.xlsx跳过:

 > read.xlsx("test.xlsx",sheetIndex=1) id blank names 1 1 NA John 2 2 NA Jacob 3 3 NA Jingel 4 4 NA Heimer 5 5 NA Schmidt 6 6 NA Joe 7 7 NA Public 8 8 NA Jane 9 9 NA Doe 10 10 NA Ramsey > read.xlsx("test2.xlsx",sheetIndex=1) id names 1 1 John 2 2 Jacob 3 3 Jingel 4 4 Heimer 5 5 Schmidt 6 6 Joe 7 7 Public 8 8 Jane 9 9 Doe 10 10 Ramsey 

但是,如果我在read.xlsx2上使用test2.xlsx

 > read.xlsx2("test.xlsx",sheetIndex=1) id X. names 1 1 John 2 2 Jacob 3 3 Jingel 4 4 Heimer 5 5 Schmidt 6 6 Joe 7 7 Public 8 8 Jane 9 9 Doe 10 10 Ramsey 

现在它被读入一个名为X.factor列。

如果我尝试扩展这个有一堆空列,这是我得到的:

 > read.xlsx2("test3.xlsx",sheetIndex=1) id X. names X..1 names2 X..2 names3 X..3 names4 1 1 John John John John 2 2 Jacob Jacob Jacob Jacob 3 3 Jingel Jingel Jingel Jingel 4 4 Heimer Heimer Heimer Heimer 5 5 Schmidt Schmidt Schmidt Schmidt 6 6 Joe Joe Joe Joe 7 7 Public Public Public Public 8 8 Jane Jane Jane Jane 9 9 Doe Doe Doe Doe 10 10 Ramsey Ramsey Ramsey Ramsey 

所以read.xlsx2创build的read.xlsx2也是可以预测的。 另外(我不能确定我在哪里听到这个,所以我不能源),我认为这是一个很好的习惯,无论如何使用read.xlsx2 – 更快,等等。

我也可以添加这个?read.xlsx

read.xlsx2函数可以在Java中执行更多的工作,因此可以获得更好的性能(对于具有100,000个单元或更多单元的工作表,速度要快一个数量级)。 read.xlsx2的结果通常与read.xlsx不同,因为内部read.xlsx2使用为表格数据量身定制的readColumns。

所以@ user1578653build议使用readColumns ,只需要使用read.xlsx