0

我的数据目录中有几个 .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)
                    }
}

上传运行代码,对于这种问题,可能是个问题。

4

2 回答 2

1

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

big_list = lapply(files, read.xls)

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

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

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

假设您想阅读前四张纸。

于 2013-02-08T11:41:17.083 回答
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)
                    }
}
于 2013-02-08T11:16:10.547 回答