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.csv2 は 1,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 の推測器はこれらを数値として読み、ゼロを破壊します。
00501 が 501 になりました。データはファイルの中では正しく、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 文字列を直接解析します — 実験や小さな例に最適です。- 元を取る引数はこれらです:
header、sep(セミコロンにはread.csv2)、na.strings、skip、colClasses。 - 「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 = "," も)を渡します。