递归读取R中的xls表

时间:2013-02-08 11:11:28

标签: r xls

我的Data目录中有几个包含不同页数的.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)
                    }
}

要上传正在运行的代码,对于此类问题,可能会出现问题。

2 个答案:

答案 0 :(得分:1)

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

big_list = lapply(files, read.xls)

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

如果您还想阅读工作表,可以使用mapply:

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

假设你想阅读前四张。

答案 1 :(得分: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)
                    }
}