R言語でCSVファイルを読み込む方法はいくつかありますが、ここでは、ディファクト・スタンダードであるtidyverseパッケージに含まれているreadrパッケージのread_csv()によるCSVファイルの読み込みについて解説します。
使い方
まず、使い方ついて確認しておきます。多くの引数がありますが、基本的には覚える必要はありません。実作業としては、第一引数にファイルパスを指定する、ということを覚えるだけで十分です。read_csv()の処理結果を見たときに、読み込み方がおかしいとなったときに始めて引数を調整するような感覚で問題ありません。また、read_csv()であらかじめ読み込む列の選択ができますが、全体を読み込んだ後、dplyr::select()で同じことができるので、やはり覚える優先度は低いです。同様に、read_csv()であらかじめ列のデータ型を指定できますが、全体を読み込んだ後、dplyr::mutate()を使用して列のデータ型を変換できるので、やはり覚える優先度は低いです。このようなread_csv()の引数を覚えるよりかはdplyr::select()やdplyr::mutate()の使い方を覚える方が遥かに汎用性が高いので、そちらの方の習得を優先しましょう。
read_csv(
file,
col_names = TRUE,
col_types = NULL,
col_select = NULL,
id = NULL,
locale = default_locale(),
na = c("", "NA"),
quoted_na = TRUE,
quote = "\"",
comment = "",
trim_ws = TRUE,
skip = 0,
n_max = Inf,
guess_max = min(1000, n_max),
name_repair = "unique",
num_threads = readr_threads(),
progress = show_progress(),
show_col_types = should_show_types(),
skip_empty_rows = TRUE,
lazy = should_read_lazy()
)
read_tsv(
file,
col_names = TRUE,
col_types = NULL,
col_select = NULL,
id = NULL,
locale = default_locale(),
na = c("", "NA"),
quoted_na = TRUE,
quote = "\"",
comment = "",
trim_ws = TRUE,
skip = 0,
n_max = Inf,
guess_max = min(1000, n_max),
progress = show_progress(),
name_repair = "unique",
num_threads = readr_threads(),
show_col_types = should_show_types(),
skip_empty_rows = TRUE,
lazy = should_read_lazy()
)
引数の意味
ファイルパスまたは接続、リテラルデータ(単一の文字列または生のベクトル)のいずれかを指定します。
.gzまたは.bz2、.xz、.zipで終わるファイルは自動的に解凍されます。http://またはhttps://、ftp://、ftps://で始まるファイルは自動的にダウンロードされます。リモートgzファイルも自動的にダウンロードされ、解凍されます。
リテラルデータは、例やテストに最も役立ちます。リテラルデータとして認識されるには、入力はI()で囲まれているか、少なくとも 1 つの改行を含む文字列であるか、少なくとも1つの改行を含む文字列を含むベクトルである必要があります。
clipboard()の値を使用すると、システム クリップボードから読み取られます。
TRUEまたはFALSE、列名の文字ベクトルを指定します。
TRUEの場合、入力の最初の行が列名として使用され、データフレームに含まれません。FALSEの場合、列名は自動的に生成されます:X1、X2、X3など。
col_namesが文字ベクトルの場合、値は列の名前として使用され、入力の最初の行は出力データフレームの最初の行に読み込まれます。
(NA)列名がないと警告が生成され、ダミーの名前が入力されます…1, …2など列名が重複すると警告が生成され、一意になります。これがどのように行われるかを制御するには、name_repairを参照してください。
NULLまたはcols()、文字列のいずれかを指定します。
NULLの場合、すべての列タイプは、ファイル全体に散在する入力のguess_max行から推論されます。これは便利(かつ高速)ですが、堅牢ではありません。推測されたタイプが間違っている場合は、guess_maxを増やすか、正しいタイプを自分で指定する必要があります。
list()またはcols()によって作成される列仕様には、カラムごとに1つの列仕様が含まれている必要があります。列のサブセットのみを読み取る場合は、cols_only()を使用します。
または、各文字が1つの列を表すコンパクトな文字列表現を使用することもできます。
文字 | 意味 |
---|---|
c | character |
i | integer |
n | number |
d | double |
l | logical |
f | factor |
D | date |
T | date time |
t | time |
? | guess |
_ | skip |
– | skip |
デフォルトでは、カラム指定なしでファイルを読み取ると、読み手が何を推測したかを示すメッセージが出力されます。このメッセージを削除するには、show_col_types=FALSEを設定するか、options(readr.show_col_types = FALSE) を設定します。
読み込む列を指定します。
dplyr::select()と同じ言語を使用して、列を名前で参照できます。c()を使用して、複数の選択式を使用します。この使用法はあまり一般的ではありませんが、col_selectは数値列インデックスも受け入れます。選択言語の詳細については、?tidyselect::languageを参照してください。
ファイルパスを格納する列の名前を指定します。
これは、複数の入力ファイルを読み取って、ファイルパスにデータ収集日などのデータがある場合に便利です。NULL(デフォルト)の場合、追加の列は作成されません。
ロケールを指定します。
ロケールは、場所によって異なるデフォルトを制御します。locale()を使用して、デフォルトのタイムゾーン、エンコーディング、小数点、ビッグマーク、曜日/月の名前などを制御する独自のロケールを作成できます。
欠損値として解釈する文字列の文字ベクトルを指定します。
このオプションをcharacter()に設定して、欠損値がないことを示します。
引用符で囲まれた欠損値は、欠損値 (デフォルト) または文字列として扱われるべきかを指定します。このパラメータは、readr 2.0.0で非推奨になりました。
文字列を引用符で囲むために使用される1文字を指定します。
コメントを識別するために使用される文字列を指定します。
コメント文字の後のテキストは、黙って無視されます。
先頭と末尾の空白(ASCIIスペースとタブ)は、解析する前に各フィールドからトリミングする必要があるかどうかを指定します。
データを読み取る前にスキップする行数を指定します。
commentが指定されている場合、コメント化された行はスキップ後に無視されます。
読み取る最大行数を指定します。
列の型を推測するために使用する最大行数を指定します。
読み取られた行数を超えて使用することはありません。
列名の処理の方法を指定します。
デフォルトの動作では、列名が「一意」であることを確認します。次のような様々な修復戦略がサポートされています。
指定文字列 | 意味 |
---|---|
“minimal” | 名前の基本的な存在を超えて、名前の修復やチェックは行いません |
“unique”(デフォルト値) | 名前が一意で、空でないことを確認します |
“check_unique” | 名前の修復はありませんが、一意であることを確認します |
“unique_quiet” | 独自の戦略で、静かに修理します |
“universal” | 名前を一意で構文的なものにします |
“universal_quiet” | 普遍的な戦略で、静かに修理します |
関数 | カスタム名前の修復を適用します(例: base Rのスタイルの名前にはname_repair = make.names) |
関数 | purrrスタイルの無名関数、rlang::as_function()を参照してください |
この引数はrepairとしてvctrs::vec_as_names()に渡されます。これらの条件と、それらを強制するために使用される戦略の詳細については、vctrs::vec_as_names()を参照してください。
データの初期解析と遅延読み取りに使用する処理スレッドの数を指定します。
データにフィールド内に改行が含まれている場合、パーサーはこれを自動的に検出し、1つのスレッドのみを使用するようにフォールバックする必要があります。ただし、引用符で囲まれたフィールド内にファイルの改行があることがわかっている場合は、明示的にnum_threads = 1を設定するのが最も安全です。
プログレスバーを表示するかどうかを指定します。
デフォルトでは、インタラクティブセッションでのみ表示され、ドキュメントを編んでいる間は表示されません。自動プログレスバーは、オプションreadr.show_progressをFALSEに設定することで無効にできます。
FALSEの場合、推測された列タイプを表示しません。TRUEの場合、列タイプが指定されていても、常に列タイプが表示されます。NULLの場合(デフォルト)は、col_types引数によって明示的に指定されていない列の型のみを表示します。
空白行はまったく無視する必要があるかどうかを指定します。
つまり、このオプションがTRUEの場合、空白行はまったく表示されません。FALSEの場合、すべての列でNA値で表されます。
遅延読み込みを行うかどうかを指定します。
デフォルトでは、これはFALSEです。これは、ファイルを遅延して読み取るときに特別な考慮事項があり、一部のユーザーがつまずいてしまうためです。具体的には、同じファイルを読み取ってから書き戻すときに問題が生じます。しかし、一般的には、遅延読み取り(lazy = TRUE)には、特に対話型の使用や、ダウンストリーム作業に行または列のサブセットのみが含まれる場合に、多くの利点があります。
戻り値
read_csv()の戻り値はtibble()です。簡単に言えば、read_csv()の実行結果としてデータフレームを取得できると考えて大丈夫です。
解析に問題がある場合は、警告が表示されます。データセットでproblems()を呼び出すことで、完全な詳細を取得できます。
例
例の準備として、あらかじめtidyverseを読み込んでおきます。実際には、read_csv()はtidyverseパッケージに含まれているreadrパッケージに含まれているので、「library(readr)」としても問題ありません。
library(tidyverse)
readrパッケージにはあらかじめmtcars.csvが格納されています。mtcarsは、1974年のMotor TrendUS誌から抽出され、32台の自動車(1973〜74年モデル)の燃料消費量と自動車の設計と性能の10の側面で構成されています。
列名 | 説明 |
---|---|
mpg | マイル/(US) ガロン |
cyl | シリンダー数 |
disp | 変位(cu.in.) |
hp | 総馬力 |
drat | 後輪車軸比 |
wt | 重量(1000ポンド) |
qsec | 1/4マイルタイム |
vs | エンジン(0 = V字型、1 = ストレート) |
am | トランスミッション(0 = 自動、1 = 手動) |
gear | 前進ギアの数 |
carb | キャブレターの数 |
read_csv()でこのCSVファイルを読み込むと次になります。readr_example()はreadrパッケージに格納されているファイルを読み込むという意味になります。実作業としては、read_csv()の第一引数にはファイルパスを指定することが多いです。
df <- read_csv(readr_example("mtcars.csv"))
Rows: 32 Columns: 11
── Column specification ───────────────────────────
Delimiter: ","
dbl (11): mpg, cyl, disp, hp, drat, wt, qsec, vs, am, gear, carb
ℹ 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.
データ構造を確認します。
df |> str()
spc_tbl_ [32 × 11] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
$ mpg : num [1:32] 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
$ cyl : num [1:32] 6 6 4 6 8 6 8 4 4 6 ...
$ disp: num [1:32] 160 160 108 258 360 ...
$ hp : num [1:32] 110 110 93 110 175 105 245 62 95 123 ...
$ drat: num [1:32] 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
$ wt : num [1:32] 2.62 2.88 2.32 3.21 3.44 ...
$ qsec: num [1:32] 16.5 17 18.6 19.4 17 ...
$ vs : num [1:32] 0 0 1 1 0 1 0 1 1 1 ...
$ am : num [1:32] 1 1 1 0 0 0 0 0 0 0 ...
$ gear: num [1:32] 4 4 4 3 3 3 3 4 4 4 ...
$ carb: num [1:32] 4 4 1 1 2 1 4 2 2 4 ...
- attr(*, "spec")=
.. cols(
.. mpg = col_double(),
.. cyl = col_double(),
.. disp = col_double(),
.. hp = col_double(),
.. drat = col_double(),
.. wt = col_double(),
.. qsec = col_double(),
.. vs = col_double(),
.. am = col_double(),
.. gear = col_double(),
.. carb = col_double()
.. )
- attr(*, "problems")=
read_csv2()について
readrパッケージには、read_csv()に似たread_csv2()があります。read_csv2()は、フィールド区切り記号を「;」、小数点を「,」としたCSVファイルを読み込むために使用します。ちなみに、read_tsv2()はありません。
CSV、TSV以外の区切られたテキストの読み込み
これまでは、CSVファイルやTSVファイルの読み込み方をお伝えしてきました。ここでは、一般的な区切りのあるテキストファイルを読み込む方法をお伝えします。一般的な区切りのあるテキストファイルを読み込むには、tidyverseパッケージに含まれているreadrパッケージのread_dilim()を使用します。
read_delim(
file,
delim = NULL,
quote = "\"",
escape_backslash = FALSE,
escape_double = TRUE,
col_names = TRUE,
col_types = NULL,
col_select = NULL,
id = NULL,
locale = default_locale(),
na = c("", "NA"),
quoted_na = TRUE,
comment = "",
trim_ws = FALSE,
skip = 0,
n_max = Inf,
guess_max = min(1000, n_max),
name_repair = "unique",
num_threads = readr_threads(),
progress = show_progress(),
show_col_types = should_show_types(),
skip_empty_rows = TRUE,
lazy = should_read_lazy()
)
read_delim()は、read_csv()やread_tsv()の引数との共通点が多いので、異なる部分だけを以下に解説します。
レコード内のフィールドを区切るために使用される1文字を指定します。
ファイルは特殊文字をエスケープするためにバックスラッシュを使用しているかどうかを指定します。
これは、バックスラッシュを使用して区切り文字や引用符をエスケープしたり、\\nなどの特殊文字を追加したりするために使用できるため、引数escape_doubleよりも一般的です。
ファイルは引用符を2倍にしてエスケープするかどうかを指定します。
つまり、このオプションがTRUEの場合、値””””は一重引用符\”を表します。