1

我是 R 新手,目前正在尝试使用 XLConnect 包将函数应用于不同工作簿中相同索引的工作表。

到目前为止,我已经设法读取了一个包含 excel 文件的文件夹:

filenames <- list.files( "file path here", pattern="\\.xls$", full.names=TRUE)

我已经遍历了不同的文件,阅读了每个文件的每个工作表

for (i in 1:length(filenames)){
    tmp<-loadWorkbook(file.path(filenames[i],sep=""))
    lst<- readWorksheet(tmp, 
            sheet = getSheets(tmp), startRow=5, startCol=1, header=TRUE)}

我想我想做的是遍历文件名中的文件,然后获取具有相同索引的工作表(例如,所有文件的第一个工作表,然后是所有文件的第二个工作表等)并保存这些到一个新工作簿(第一个工作簿包含所有第一个工作表,然后是第二个工作簿包含所有第二个工作表等),每个原始工作表都有一个新工作表,这些工作表是从以前的文件中获取的,然后使用

for (sheet in newlst){
    Count<-t(table(sheet$County))}

并将我的函数应用于参数 Count。

有谁知道我该怎么做或给我任何指导?抱歉,如果不清楚,请询问,我将尝试进一步解释!谢谢 :)

4

2 回答 2

1

如果我正确理解您的问题,以下应该可以解决您的问题:

require(XLConnect)

# Example: workbooks w1.xls - w[n].xls each with sheets S1 - S[m]
filenames = list.files("file path here", pattern = "\\.xls$", full.names = TRUE)

# Read data from all workbooks and all worksheets
data = lapply(filenames, function(f) {
  wb = loadWorkbook(f)
  readWorksheet(wb, sheet = getSheets(wb)) # read all sheets in one go
})

# Assumption for this example: all workbooks contain same number of sheets
nWb = sapply(data, length)
stopifnot(diff(range(nWb)) == 0)
nWb = min(nWb)

for(i in seq(length.out = nWb)) {
  # List of data.frames of all i'th sheets
  dout = lapply(data, "[[", i)
  # Note: write all collected sheets in one go ...
  writeWorksheetToFile(file = paste0("wout", i, ".xls"), data = dout, 
                       sheet = paste0("Sout", seq(length.out = length(data))))
}
于 2013-07-25T06:41:50.307 回答
0

使用 gdata/xlsx 可能是最好的。尽管它是最慢的,但它是更直观的之一。

如果 excel 的排序方式不同,此方法将失败。

鉴于没有真实的例子,这里有一些值得深思的地方。Gdata 需要安装 perl。

library(gdata)
filenames <- list.files( "file path here", pattern="\\.xls$", full.names=TRUE)
amountOfSheets <- #imput something

#This snippet gets the first sheet out of all the files and combining them
readXlsSheet <- function(whichSheet, files){
 for(i in seq(files)){
    piece <- read.xls(files[i], sheet=whichSheet)
    #rbinding frames should work if the sheets are similar, use merge if not.
    if(i == 1) complete <- piece else complete <- rbind(complete, piece)
  }
  complete
}
#Now looping through all the sheets using the previous method
animals <- lapply(seq(amountOfSheets), readXlsSheet, files=filenames)
#The output is a list where animals[[n]] has the all the nth sheets combined.          

xlsx 可能仅适用于 32 位 R,并且有自己的问题。

library(xlsx)
filenames <- list.files(pattern="\\.xls$", full.names=TRUE)
amountOfSheets <-  2#imput something

#This snippet gets the first sheet out of all the files and combining them
 readXlsSheet <- function(whichSheet, files){
    for(i in seq(files)){
      piece <- read.xlsx(files[i], sheetIndex=whichSheet)
      #rbinding frames should work if the sheets are similar, use merge if not.
      if(i == 1) complete <- piece else complete <- rbind(complete, piece)
    }
  complete
}
readXlsSheet(1, filenames)
#Now looping through all the sheets using the previous method
animals <- lapply(seq(amountOfSheets), readXlsSheet, files=filenames)
于 2013-07-24T13:44:13.587 回答