0

データ ディレクトリに、シート数が異なる複数の .xls ファイルがあります。ファイル内のすべてのシートを読み取り、それらを 1 つのリストに入れる必要があります。2 つのループを使用して、各ファイルの各シートを再帰的に読み取り、リストに追加すると思います。

問題は、新しいファイルを読み取るたびに、リスト内の前のファイルの同じ「レベル」を上書きするためです。したがって、最初のファイルの最初のレベル (シート 1) は、2 番目のファイルの最初のレベル (シート 1) によって上書きされ、3 番目のファイルの最初のレベル (シート 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 ファイルを 1 つの大きなリストに読み込み、forループを完全にスキップする場合:

big_list = lapply(files, read.xls)

また、空のオブジェクトを作成し、それらを繰り返し埋めることに注意してください。オブジェクトが大きくなるたびに、新しいメモリを割り当てる必要があります。読み取る必要があるファイルの量が多い場合、これは非常に遅くなる可能性があります。上記のソリューションlapplyでは、この問題は発生しません。

ワークシートも読みたい場合は、mapply を使用できます。

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

最初の 4 枚を読みたいとします。

于 2013-02-08T11:41:17.083 に答える
0

次の 2 つのオプションがあります。

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 に答える