R言語で複数のCSVファイルを一括でデータフレームとして読み込む方法をお伝えします。

準備

説明にあたり、複数のCSVファイルを準備します。


# dataディレクトリが存在しなければ
if (!dir.exists("data")) {
  # dataディレクトリを作成
  dir.create("data")
}
iris |>
  filter(Species == "setosa") |>
  write_csv("data/iris_setosa.csv")
iris |>
  filter(Species == "versicolor") |>
  write_csv("data/iris_versicolor.csv")
iris |>
  filter(Species == "virginica") |>
  write_csv("data/iris_virginica.csv")

複数のCSVファイルを一括で読み込む

複数のCSVファイルを一括で読み込む最小限のコードは次になります。


library(tidyverse)

df <- list.files("data", pattern = "*.csv", full.names = TRUE) |>
  map_df(~ read_csv(.))

このコードを簡単に説明すると、次になります。

  1. 「list.files(“data”, pattern = “*.csv”, full.names = TRUE)」でdataディレクトリにあるすべてのCSVファイルのフルパスを取得
  2. 「map_df(~ read_csv(.))」で個々のCSVファイルをread_csv()で読み込んだ後一つのデータフレームにまとめる

複数のCSVファイルのフルパスが取得できれば簡単に一括で読み込めるので、以下、list.files()について解説します。

list.files()の使い方

list.files()の使い方は次になります。


list.files(path = ".", pattern = NULL, all.files = FALSE,
           full.names = FALSE, recursive = FALSE,
           ignore.case = FALSE, include.dirs = FALSE, no.. = FALSE)

list.files()の引数の意味

list.files()の引数の意味は次になります。

path = “.”

フルパス名の文字ベクトルを指定します。
デフォルトは、作業ディレクトリgetwd()に対応します。チルダ展開(path.expandを参照)が実行されます。欠損値は無視されます。エンコードがマークされた要素は、ネイティブエンコードに変換されます(失敗した場合は、存在しないと見なされます)。

pattern = NULL

正規表現でファイル名を指定します。
正規表現に一致するファイル名のみが返されます。

all.files = FALSE

論理値を指定します。FALSEの場合、表示されているファイルの名前のみが返されます(Unix スタイルの可視性に従って、名前がドットで始まらないファイルです)。TRUEの場合、すべてのファイル名が返されます。

full.names = FALSE

論理値を指定します。TRUEの場合、ディレクトリパスがファイル名の先頭に追加され相対ファイルパスが与えられます。FALSEの場合、(パスではなく)ファイル名が返されます。

recursive = FALSE

ディレクトリを再帰的にする走査するかどうかを指定します。

ignore.case = FALSE

パターンマッチングで大文字と小文字を区別するかどうかを指定します。

include.dirs = FALSE

サブディレクトリを再帰的な走査に含めるかどうかを指定します。

no.. = FALSE

「.」と「..」の両方を非再帰的なリストからも除外するかどうかを指定します。

read_csv()について

上記のコードで複数のCSVファイルを一括して読み込むと、次のように出力されます。


Rows: 50 Columns: 5                                                                                                                                                        
── Column specification ──────────────────────────────
Delimiter: ","
chr (1): Species
dbl (4): Sepal.Length, Sepal.Width, Petal.Length, Petal.Width

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
Rows: 50 Columns: 5                                                                                                                                                        
── Column specification ──────────────────────────────
Delimiter: ","
chr (1): Species
dbl (4): Sepal.Length, Sepal.Width, Petal.Length, Petal.Width

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
Rows: 50 Columns: 5                                                                                                                                                        
── Column specification ──────────────────────────────
Delimiter: ","
chr (1): Species
dbl (4): Sepal.Length, Sepal.Width, Petal.Length, Petal.Width

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

これが煩わしいならば、「read_csv(., show_col_types = FALSE)」のようにすれば出力されません。read_csv()の引数については、R入門 CSV・TSVファイルの読み込みを参照ください。

読み込んだデータフレームにファイルパスを追加

複数のCSVファイルを読み込んだときに、どのCSVファイルからのデータなのか分かった方が良い場合があります。そのときには、次のようなコードになります。出力は制御してあります。


library(tidyverse)

df <- list.files("data", pattern = "*.csv", full.names = TRUE) |>
  map_df(~ read_csv(., id = "file", show_col_types = FALSE))

df |> head()

# A tibble: 6 × 6
  file                 Sepal.Length Sepal.Width Petal.Length Petal.Width Species
                                                  
1 data/iris_setosa.csv          5.1         3.5          1.4         0.2 setosa 
2 data/iris_setosa.csv          4.9         3            1.4         0.2 setosa 
3 data/iris_setosa.csv          4.7         3.2          1.3         0.2 setosa 
4 data/iris_setosa.csv          4.6         3.1          1.5         0.2 setosa 
5 data/iris_setosa.csv          5           3.6          1.4         0.2 setosa 
6 data/iris_setosa.csv          5.4         3.9          1.7         0.4 setosa 
R応用 複数のCSVファイルを一括で読み込む方法