web-dev-qa-db-ja.com

複数の(Excel)ファイルをRに読み込むにはどうすればよいですか?

Rに読み込む数百の中規模のExcelファイル(5000〜50.0000行、約100列)があります。これらには、x_1.xlsxx_2.xlsxなどの明確に定義された命名パターンがあります。

これらのファイルを最速で最も簡単な方法でRにロードするにはどうすればよいですか?

29
Manuel R

list.filesを使用すると、作業ディレクトリ内のすべてのファイル名のリストを作成できます。次に、lapplyを使用してそのリストをループし、readxlパッケージのread_Excel関数で各ファイルを読み取ることができます。

library(readxl)
file.list <- list.files(pattern='*.xlsx')
df.list <- lapply(file.list, read_Excel)

もちろん、このメソッドは、read.csvread.tableなどの他のファイル読み取り関数でも使用できます。 read_Excelを適切なファイル読み取り関数に置き換え、list.filesで正しいパターンを使用していることを確認してください。

ファイルをサブディレクトリにも含める場合は、次を使用します。

file.list <- list.files(pattern='*.xlsx', recursive = TRUE)

Excelファイルを読み込むためのその他の可能なパッケージ: openxlsxxlsx


列が各ファイルで同じであると仮定すると、 dplyrbind_rowsを使用して、それらを1つのデータフレームにバインドできます。

library(dplyr)
df <- bind_rows(df.list, .id = "id")

または data.tablerbindlistを使用

library(data.table)
df <- rbindlist(df.list, idcol = "id")

どちらにも、個別のデータセットを識別するためのid列を追加するオプションがあります。


Update:数値識別子が必要ない場合は、simplify = FALSEsapplyを使用して、file.listのファイルを読み取ります。

df.list <- sapply(file.list, read.csv, simplify=FALSE)

dplyrからbind_rowsまたはdata.tableからrbindlistを使用すると、id列にファイル名が含まれるようになりました。

さらに別のアプローチはpurrr- packageを使用しています:

library(purrr)
file.list <- list.files(pattern='*.csv')
file.list <- setNames(file.list, file.list) # only needed when you need an id-column with the file-names

df <- map_df(file.list, read.csv, .id = "id")

名前付きリストを取得する他のアプローチ:数値識別子だけが必要ない場合は、前のリストのデータフレームにファイル名を割り当てることができますそれらを一緒にバインドします。これを行うにはいくつかの方法があります。

# with the 'attr' function from base R
attr(df.list, "names") <- file.list
# with the 'names' function from base R
names(df.list) <- file.list
# with the 'setattr' function from the 'data.table' package
setattr(df.list, "names", file.list)

data.tableからのrbindlistまたはdplyrからのbind_rowsを使用して、データフレームのリストを1つのデータフレームにバインドできます。 id列には、数値識別子ではなくファイル名が含まれるようになりました。

66
Jaap