2013-02-08 43 views
0

我的Data目录中有几个.xls文件,其中有不同数量的表单。我需要阅读文件中的所有表单并将它们放入单个列表中。我想使用两个循环来递归读取每个文件中的每个工作表并将其附加到列表中。递归读取R中的xls表格

问题是因为每次我读取一个新文件时,它会覆盖上一个文件列表中的相同“级别”。因此,第一个文件的第一层(表1)被第二个文件的第一层(表1)覆盖,被第三个文件的第一层(表1)重写,依此类推。

每次读取新文件时,如何在不重新列表的情况下追加所有文件的所有表单?

这是我写的代码:

files <- list.files() 
listGil <- list() 
for(i in seq_along(files)){ 
    s <- sheetCount(files[i]) 
         for(k in 1:s) 
        { 
         listGil[[k]] <- read.xls(files[i], sheet = k) 
        } 
} 

上传一个正在运行的代码,这样那样的问题,可能是一个问题。

回答

0

你有两个选择:

1)用列表的列表(我认为这是更好):

files <- list.files() 
listGil <- vector(mode='list',length(files)) 
for(i in seq_along(files)){ 
    s <- sheetCount(files[i]) 
    listGil[[i]] <- vector(mode='list',s) 
         for(k in 1:s) 
        { 
         listGil[[i]][[k]] <- read.xls(files[i], sheet = k) 
        } 
} 

2)仅使用1个清单:

files <- list.files() 
listGil <- list() 
for(i in seq_along(files)){ 
    s <- sheetCount(files[i]) 
         for(k in 1:s) 
        { 
         listGil[[length(listGil)+1]] <- read.xls(files[i], sheet = k) 
        } 
} 
1

或者如果要将所有xls文件读入一个大列表,并跳过for循环:

big_list = lapply(files, read.xls) 

并且要小心创建空对象并迭代填充它们。每次对象增长时,都需要分配一个新的内存。当您需要读取的文件量很大时,这可能会变得很慢。上述使用lapply的解决方案不会遇到此问题。

,如果你也想读的工作表,您可以使用mapply:

big_list = mapply(read.xls, xls = files, sheet = 1:4) 

假设你想读的第一4张。

+0

使用lapply加速代码,但它只读取每个xls文件的第一个工作表。 – Riccardo

+0

我编辑了我的代码,包括阅读多个工作表。 –