いつかギャフンと言わせたい

平凡な会社員が、いつか周りをギャフンと言わせるための自分記録ノンジャンル記録。

【R】csvデータを読み込む時にいろいろエラーが出ることを解消したい

お手軽フリー統計ソフトRでのcsvデータの読み込み時のエラー対応について。
ざっくり言うと

  1. 読み込みたいcsvデータのエンコードを「UTF-8」に変換しておく
  2. 文字列や数値が混在しても混乱しないおまじない"as.is=T"を入れる
  3. それでも数値が文字列化しているなら、数値変換処理"as.numeric()"を実行


 お手軽フリー統計ソフトRをひさしく触っていませんでしたが、仕事上いよいよ本格的にデータ解析が必要になったので、ひさしぶりにRさんと触れ合いました。
すると、どうでしょう!?なんか嫌われてるの?ってくらいにエラーがでます。やはり恋人も統計ソフトも会う頻度は高い方がいいということでしょうか。すこしリハビリが必要だと感じました。

今回、大きな壁となったのは、「csvデータの読み込み」でした。
これって、Rの基礎の基礎じゃん?と思われると思いますが、元データの特性や作りたいデータの型に応じて処理方法を丁寧に構成しないと、ドツボにはまってもうやる気が無くなるレベルに到達してしまうかもしれません。侮るなかれです。

基本的なcsvデータの読み込み方法は以下の通り。

data <- read.csv("data_file.csv")

これで、ほとんどが解決です。1行目を列名としているデータの場合は

data <- read.csv("data_file.csv",header=T)

ですね。これも基本中の基本

マルチバイトとの戦い

しかし、これをやっても読み込めない場合があるんですね。
そのときはこんなエラーが出ます。

> data <- read.csv("data_file.csv")
 以下にエラー make.names(col.names, unique = TRUE) : 
   '<95><bd><90><ac><32>2<94>N<8d><91><90><a8><92><b2><8d><b8>
 <81>@<8f><ac><92>n<88><e6><8f>W<8c>v<81>@<81>i<91><8d><96>
<b1><8f>ȓ<9d><8c>v<8b>ǁj' に不正なマルチバイト文字があります 

おいおい。もうさっぱりですよ。「マルチバイト文字?はぁ?」といった感じ。
さっそくググってみます。

外部データ読み込み時に起こる、マルチ文字エラーの対処 | Takuro Fujita@NITFC

でますねぇ。みんな困ってるんですね。
どうやら元データのエンコードの問題みたいです。
通常、日本で作られたデータは、「Shift_JIS」という形式でエンコードされています。
この形式はRは苦手のようです。参考サイトの情報を元に、万国共通の「UTF-8」にしておきます。

csvファイルをテキストエディタで開いて(ここではCotEditor.appを使用)
f:id:demacassette:20151128003823p:plain
エンコードを再設定
f:id:demacassette:20151128003829p:plain
上書き保存します。

すると、先ほどのRコードでデータの読み込みができます。

なぞのLevels...orz

無事に読み込めたデータの中身を確認してみます。
データが多すぎて中身を全部表示するとコンソールがパンパンになる場合は

#データの最初の6行目までを表示
head(data)

#ピンポインドでデータを確認
data[10,14]
> data[10,14]
[1] 37
444 Levels:  - 1 10 100 10080 101 102 103 104 105 106 10670 107 1075 108 1089 ... X

なんでしょうね。444 Levels: ~~~ ってのは。これって今までもずいぶんでてきたやつなんですけど、未だに意味はわかっていません。というか、分かりたいと思いません。なんとなくスルーしても解析はできてきたので。

しかし、このままだと、格納されたデータのた足し算すらできない状況です。

> data[10,13]
[1] 46
427 Levels:  - 041 10 100 10067 101 102 103 104 105 106 107 108 109 10952 ... X
> data[10,14]
[1] 37
444 Levels:  - 1 10 100 10080 101 102 103 104 105 106 10670 107 1075 108 1089 ... X
> data[10,13]+data[10,14]
[1] NA
<span style="color: #d32f2f"> 警告メッセージ: 
In Ops.factor(data[10, 13], data[10, 14]) :+’  因子に対しては無意味です </span>

これはまずい。→解決法をググります。

d.hatena.ne.jp

ありました。それらしいのが。
さっそく試してみると。。。

> data2 <- read.csv("data_file.csv", as.is=T)
> data2[10,13]
[1] "46"
> data2[10,14]
[1] "37"
> data2[10,13]+data[10,14]
[1] NA
 警告メッセージ: 
In Ops.factor(data2[10, 13], data[10, 14]) :+’  因子に対しては無意味です 

ちょちょちょっと待って、お兄さん!
計算できないじゃないですか。でも忌まわしき444 Levels: ~~~ は消えました。これは大きな前進ですね。ここまでくれば、あの手を使います。

文字列を整数(実数)に変換

"XX"といったダブルクォーテーションマーク(””)でくくられたものは、文字列扱いですということです。となれば、文字列として認識されているデータを計算したい型に変換してあげればいいわけですね。ここは、R-tipsの大御所サイトから引用します。

25.データ型とデータ構造

as.numeric()  #実数に変換
as.integer()  #整数に変換
as.character()  #文字列に変換

こっから先は、実情に応じて対応できそうです。

本日のデータソース

平成22年国勢調査
>小地域集計
>とある県
>年齢(5歳階級), 男女別人口(総年齢,平均年齢及び外国人―特掲)-町丁・字等

参考図書

やっぱり一冊は手元に置いておきたい!?

データサイエンティスト養成読本 R活用編 【ビジネスデータ分析の現場で役立つ知識が満載! 】 (Software Design plus)

データサイエンティスト養成読本 R活用編 【ビジネスデータ分析の現場で役立つ知識が満載! 】 (Software Design plus)

Rで学ぶデータ・プログラミング入門 ―RStudioを活用する―

Rで学ぶデータ・プログラミング入門 ―RStudioを活用する―