Rでcsvファイルを読み込むとエラーが出たが、どうすれば良いのか分からない!
そんな方の疑問にお答えします。
<関連記事> csvの読み込み、エクセルの読み込みも参考にしてみてください。
csvファイル読み込み時にエラーが出る主な原因
csvファイルの読み込みでエラーが出る原因は主に以下の2つです。
- 原因1: 読み込むファイルがワーキングディレクトリに入っていない
- 原因2: エンコーディングがShift_JISになっている
それぞれについて対処法を紹介します。
原因1: ファイルがワーキングディレクトリに入っていない場合
ファイルがワーキングディレクトリに入っていない場合、以下のようなエラーが出ます。
> csvdata <- read_csv("test_trees.csv", skip = 1)
Error: 'test_trees.csv' does not exist in current working directory
(!)当ブログでは、黒字が記述コード、青字がRから返されるコードとして記載しています。
対処法としては、以下の3つの方法が挙げられます。
・ワーキングディレクトリにcsvファイルを入れる
・(csvファイルを移動したくない場合は)絶対パスで読み込む
・(ワーキングディレクトリの近くのフォルダにある場合は)相対パスで読み込む
それぞれについて対処法を見ていきましょう。
対策1 : ワーキングディレクトリにcsvファイルを入れる
Rのワーキングディレクトリが分からない場合は、Rに以下のコードを入力すると現在のワーキングディレクトリが表示されます。
getwd()
"/Desktop/blog/kanisanblog"
二行目にワーキングディレクトリのパスが出てきます。
上記の場合、デスクトップにあるkanisanblogというフォルダがワーキングディレクトリということになります。Rはこのフォルダにあるファイルを読み込みに行くので、このフォルダにファイルを入れればOKです。
このフォルダがそもそもどこにあるのかが分からない…という方は、以下の方法をお試しください。
Macの場合:Spotlight(cmd + スペース)で検索
Windowsの場合:任意のフォルダを開いた時に出てくるアドレスバーに、getwd()で出てきたパスを入れてエンター
ワーキングディレクトリにcsvファイルを入れたら、以下のコードで再度csvファイルを読み込んでみてください。csvファイルを読み込む方法についてはコチラ。
csvdata <- read_csv("ファイル名")
対策2 : 絶対パスでcsvファイルのパスを入れる
csvファイルを格納する場所が決まっていてファイルを移動させたくない場合は、直接csvファイルのパスを指定しましょう。
<パスの調べ方>
・macの場合:読み込みたいcsvファイルの上で副ボタン(右クリック)を押し、optionキーを押す→"xx.csvのパス名をコピー"をクリック
・windowsの場合:読み込みたいcsvファイル上でShiftキーを押しながら右クリック→"パスのコピー"をクリック
コピーしたパスのスラッシュが、¥や\になっている場合は、/に置き換えてくださいね!
このパスをコードに入れて実行すれば読み込むことができます。
csv2 <- read_csv("/Users/kanisan/ProjectX/Data/Book1.csv")
head(csv2)
対策3: 相対パスでcsvファイルのパスを入れる
現在のディレクトリ(=ワーキングディレクトリ)を起点として、目的のファイルがどこにあるかを指定する方法です。
例えば、ワーキングディレクトリの上の階層にcsvファイルが置かれている場合は、../をつけると上の階層に移動することができます。上の上の階層に行きたい場合は、../../と足していけば上へ上へ移動できます。
# ワーキングディレクトリの上の階層にあるファイルを指定する
csv <- read_csv("../kanisan/Book1.csv")
# ワーキングディレクトリの上の上の階層にあるファイルを指定する
csv <- read_csv("../../kanisan/Book1.csv")
Rの補完機能について(Tabキー)
../を付けてからTabキーを押せば、移動先のディレクトリにどんなファイルが入っているかわかるので便利です。これをRの補完機能と言いますが、予測変換みたいなものです。
この機能を使えば、フォルダ間の移動やファイルの指定が簡単にできるようになります。ファイルパスを入力する時だけでなく、関数や引数の入力をする時にも大活躍します。
余談ですが、松浦亜弥の"桃色片想い"という歌で「愛!夢!ドットドットスラッシュ!」という歌詞がありました。さらに上の(階層に)いくっていうことだったんですね...
原因2: エンコーディングがShift_JISになっている場合
筆者がたまたま持っていたデータの場合、以下のようなエラーが出ました。
> test <- read_csv("02_Data/testdata/testdata.csv")
Rows: 500 Columns: 5
Error in nchar(x, "width") : invalid multibyte string, element 1
日本語が入ったcsvファイルの場合、文字化けしたり読み込めなかったりします。
というのも、readrパッケージのread_csv関数を使ってcsvファイルを読み込む場合、ファイル形式がUTF-8であるものとしてファイルを読み込みます。一方で、日本語版のwindows OSのエンコーディングはShift_JIS(CP932)であるため、Excelでcsvを出力したファイルを読み込もうとするとエラーが出るようです。
エンコーディングの確認は以下のコードでできます。
library(tidyverse) #すでに読み込み済みの場合はスルーしてください
# エンコーディングを確認する
guess_encoding("test/data/testdata.csv")
> guess_encoding("test/data/testdata.csv")
# A tibble: 1 × 2
encoding confidence
<chr> <dbl>
1 Shift_JIS 0.28
エンコーディングがShift-JISと書いていますね!
対策:エンコーディングをCP932に指定して読み込む
以下のコードで、エンコーディングをCP932に指定してあげるとRで読み込めるようになります。
csv <- read_csv("test/data/testdata.csv",
locale = locale(encoding = "CP932"))
head(csv)
まとめ:csv読込時にエラーが出た時の対処法は主に二つ!
csvファイル読み込み時のエラーの原因は大きく以下の二つです。
1. ワーキングディレクトリ内にデータが入っていない
2. エンコーディングの問題
1に関しては、ワーキングディレクトリ内に移動させるか、絶対/相対パスを指定することで対処できます。
2については、主にwindowsで作られたcsvファイルで起こる現象で、guess_encoding("ファイル名")でエンコーディングを確認し、read_csv("ファイル名", locale = locale(encoding = "CP932"))とすることで読み込むことが可能です。
その他のR関連記事もぜひご参考ください♪
R言語の勉強におすすめの本
今後Rの勉強をしていきたい!という方に、こちらの参考書がおすすめです。
特に、RユーザのためのRStudio実践入門は、tidyverseパッケージに特化して書かれていてとても実用的でしたのでオススメです。私自身、この本を読んでRで出来ることが一気に増えた実感のある本です。kindleで試し読みもできるのでぜひ参考にしてください。
この記事がRを学ぶ皆様のお役に立ちますように。