Menu

R で CSV ファイルを読み込む(read.csv と read_csv)

read.csv() で CSV ファイルを R に取り込む方法 — 重要な引数、失敗の大半を引き起こす作業ディレクトリの罠、そして readr::read_csv を使う価値があるのはいつか。

このページのコードはエディタで実行できます - 編集してすぐに結果を確認できます。

read.csv() は CSV ファイルをデータフレームに変える

R で CSV を読み込むのは、言語に組み込まれた関数呼び出し 1 つで済みます — パッケージは不要です。

sales <- read.csv("sales.csv")

read.csv() はファイルを読み、1 行目を列名として使い、各列の型を推測して、データフレーム を返します。行儀のよいファイルについては、これで話は終わりです。

ファイルがまったくなくても動作を確認できます。read.csv()text 引数を通じて生の CSV テキストも受け取るからです — 同じパーサーに、ファイル名の代わりに文字列を与えるのです。

str() は、インポートしたものに対して最初に実行すべきものです。各列を推測された型とともに表示します。ここでは name は文字列、score は整数、passed は論理値として取り込まれました — すべて値から推測されたものです。手早く目視で確認するには、head(students) が先頭の行を表示し、nrow(students) が行数を数えます。数値のはずの列が chr として現れたら、その列の中に数値でないものがあります — 紛れ込んだコメント、"N/A"、桁区切り記号など — そしてそれを直すべきはその瞬間であって、プロットを 3 つ描いた後ではありません。

重要な引数

read.csv() には数十のパラメータがありますが、使うのはおよそ 5 つです。

header — 1 行目が列名を持つかどうか。既定は TRUE です。ファイルがいきなりデータから始まる場合は header = FALSE を渡すと、R が列に V1, V2, ... と名前を付けます。

sep — フィールドの区切り文字。既定は "," です。ヨーロッパの多くの地域では、カンマが小数点として使われるため、CSV をセミコロン区切りで書きます。R にはまさにそのためのあらかじめ設定された変種があります。read.csv2()sep = ";"dec = "," を使います。

身長がきちんとした数値として出てきます — read.csv21,63 が 1.63 を意味すると知っていました。このファイルに素の read.csv を使っていたら、めちゃくちゃな 1 列になっていたはずです。小数点であるカンマで正しく分割できるものはないからです。

na.strings — どの文字列を欠損とみなすか。既定では "NA" だけが欠損値になります。実際のエクスポートは欠損データを空セル、"missing""-""NULL" として書き出します — そしてそれらを宣言しない限り、テキストとして到着し、列全体を文字列に引きずり込みます。

適切な na.strings を指定すれば、空欄は本物の NA になり、score は数値のまま保たれます。指定しなければ "missing" はただの単語であり、その列はテキストになります。

skip — データが始まる前に無視する行数。エクスポートは実際の表の上にタイトル行を 1、2 行置きたがります。skip = 2 はそれらを飛ばします。

colClasses — R に推測させる代わりに列の型を強制します。典型的な犠牲者は先頭にゼロが付くもの — 郵便番号、電話番号、商品 ID — です。R の推測器はこれらを数値として読み、ゼロを破壊します。

00501501 になりました。データはファイルの中では正しく、R の中では黙って間違っていたのです。colClasses = c("integer", "character") はパーサーに各列が何であるかを順に伝え、ゼロが生き残ります。

もはや不要な引数が 1 つあります。stringsAsFactors です。R の歴史の大半において、read.csv() は明示しない限りすべてのテキスト列を因子に変換しており、それが膨大な混乱を招きました。R 4.0 以降は既定が FALSE になり、テキストはテキストのまま残ります。古いチュートリアルには今も stringsAsFactors = FALSE が散らばっていますが、現在の R では無害ながら冗長です。

ファイルパス: read.csv が失敗する第 1 の理由

R を学ぶ人が最初の週に必ず出会うエラーです。

Error in file(file, "rt") : cannot open the connection
In addition: Warning message:
cannot open file 'sales.csv': No such file or directory

ファイルは存在します — ファイルマネージャーで見えているはずです。しかし R はそこを見ていません。"sales.csv" のような裸のファイル名は R の 作業ディレクトリ を基準に解決され、それはたいていファイルが置かれているフォルダではありません。2 行で診断できます。

getwd()                    # where R is actually looking
file.exists("sales.csv")   # FALSE means the path is wrong, full stop

file.exists()FALSE と言うなら、何度実行し直しても無駄です — パスを直しましょう。フルパスを与える(read.csv("C:/Users/ada/data/sales.csv") — Windows でもスラッシュは動き、バックスラッシュより安全です)か、setwd() で R の作業ディレクトリをデータのフォルダに移します。作業ディレクトリとは何か、プロジェクトがどうそれを管理するか、そしてなぜスクリプト内の setwd() が嫌われるのかは 作業ディレクトリ で扱っています。

file.exists() を反射にしましょう。「謎のインポート失敗」を 1 秒で「パスの打ち間違い」に変えてくれます。

URL から直接 CSV を読み込む

read.csv() はファイル名を受け取るところならどこでも URL を受け取り、ファイルをダウンロードしてくれます。

url <- "https://raw.githubusercontent.com/mwaskom/seaborn-data/master/penguins.csv"
penguins <- read.csv(url)
str(penguins)

チュートリアルや公開データセットには便利です — ダウンロードの手順もパスの問題もありません。代償として、スクリプトがネットワークとその URL の存続に依存するようになります。何度も再実行するものについては、一度ダウンロードしてローカルのコピーを読みましょう。

readr::read_csv — 高速でおしゃべりな代替

tidyverse は独自の CSV リーダーを readr パッケージで提供しています: read_csv()(ドットではなくアンダースコア)。読むことになる現代の R コードの多くがこれを使うので、知っておく価値があります。

install.packages("readr")   # once
library(readr)              # every session

flights <- read_csv("flights.csv")

read.csv() との実務上の違いは次のとおりです。

  • 速度 — 数十万行のファイルで体感できるほど高速です。
  • tibble を返す — コンソールを埋め尽くす代わりにコンパクトなプレビューを表示する、現代化されたデータフレームです。
  • 推測結果を報告する — 読み込み後に各列の検出された型を表示するので、数値のはずの列が文字列として解析された場合、後で驚く代わりにすぐ見えます。
  • 列名を決して壊さないread.csv()first name のようなヘッダーを first.name に書き換えますが、read_csv() はそのまま残します。

小さなファイルならどちらの関数でも構いません。ファイルが大きくなったときや、スクリプトの残りがどのみち tidyverse であるときに read_csv() に手を伸ばしましょう。上で述べたパス、区切り文字(read_csv2() もあります)、欠損値の文字列(na =)についてはすべて、引数名が少し違うだけでそのまま当てはまります。

分析が終わったら、外へ戻る道 — 結果をファイルに書き出す方法 — は write.csv です。

この記事のまとめ

  • df <- read.csv("file.csv") は CSV をデータフレームに読み込みます。すぐに str()head() で確認しましょう。
  • read.csv(text = "...") は CSV 文字列を直接解析します — 実験や小さな例に最適です。
  • 元を取る引数はこれらです: headersep(セミコロンには read.csv2)、na.stringsskipcolClasses
  • 「Cannot open file」は作業ディレクトリが思っている場所にないという意味です — getwd()file.exists() が即座に決着をつけます。
  • readr::read_csv() は高速な tidyverse 版です。tibble、報告される列の型、手を加えられない名前が特徴です。

次は プレーンテキストですらないファイル — readxl パッケージによる Excel スプレッドシートの読み込みです。

よくある質問

R で CSV ファイルを読み込むにはどうすればよいですか?

read.csv("file.csv") を使います — 組み込みなのでパッケージは不要です。CSV の列ごとに 1 列を持つデータフレームを返し、1 行目を列名として使います。結果を変数に代入しましょう: df <- read.csv("sales.csv")。その後 str(df)head(df) で確認します。

read.csv が 'cannot open file: No such file or directory' と言うのはなぜですか?

R は作業ディレクトリを基準にファイルを探しており、それはおそらくファイルが置かれているフォルダではありません。getwd() で R がどこを見ているかを確認し、file.exists("file.csv") で外れていることを確かめましょう。フルパスを使うか、作業ディレクトリをファイルのフォルダに設定して直します。

R の read.csv と read_csv の違いは何ですか?

read.csv() は base R で、常に利用でき、素のデータフレームを返します。read_csv() は readr パッケージ由来で、大きなファイルで高速、tibble を返し、列名に一切手を加えず、推測した列の型を表示するので誤った解析にすぐ気づけます。小さなファイルではどちらでも構いません。大きなファイルや tidyverse のパイプラインでは read_csv() を使いましょう。

R でセミコロン区切りの CSV を読み込むにはどうすればよいですか?

read.csv2("file.csv") を使います — ヨーロッパの慣習(区切り文字がセミコロン、小数点がカンマ)向けにあらかじめ設定された read.csv です。あるいは素の read.csv() に sep = ";"(必要なら dec = "," も)を渡します。

Coddy programming languages illustration

Coddyでコードを学ぼう

始める