【随時更新】Rにおけるデータクレンジング手法のチートシートをつくってみる

#動機

ぼくの頭はとってもポンコツでして、Rを使って何かしらの学習をするたびに忘れてしまうので、過去のリソースを参考にしながら何とかやっている始末です。

毎回忘れるのは超低能の宿命なのでもう諦めているのですが、毎回グーグル大明神に頼って幾つものページを経由して記憶を復元する作業は工数的にすごくよろしくないので、備忘録として自分がつまづきやすいものをまとめた雑なチートシートをつくってみることにしました。
何分初心者でして、大目に見ていただきたく…。

ちなみにRは完全に趣味で叩いているので随時更新していこうかと思います。
今回、サンプルに使用するデータセットはR標準でおなじみのirisとdplyrパッケージのstarwarsを状況に応じて使い分けて書いています。

#パイプライン演算子

##使い方

そもそもパイプライン演算子とは何ぞや?という話からしますが、有り体に言うと式の結果を次の式の第一引数として渡す振る舞いをする演算子のことです。

ソースコードは基本的に関数の引数が長ければ長いほど可読性が低くなり、解釈に時間を要します。パイプライン演算子を使用することでその負荷を軽減し、よりコードが直感的に読めるようになる効果が期待されます。
作法として以下のように書きます。

```r:CheatSheet.r
#パイプライン演算子を使用すると式の結果を次の関数の第一引数として渡すため、省略ができる
df.iris <- iris %>>%
  group_by(Species) %>>%
  summarise(mean = mean(Petal.Length)) %>>%
  print()
```

上はpipeR(%>>%)を使っていますが、標準のパイプライン演算子は「%>%」で表現します。
ちなみにRStudioを使用してコーディングされている方につきまして、パイプライン演算子は「**Ctrl + Shift + M** 」でショートカット表示できますので覚えておくと便利ですよ。

#データフレームの操作

##列名を変える

列名を変えたくなったときはnames()関数を使用して以下のように書きます。

```r:CheatSheet.r
df.iris <- iris

names(df.iris) <- c("S.L","S.W","P.L","P.W","Species")
```

##列を入れ替える
列を入れ替えるには、以下のように列の表示順番を指定します。

```r:CheatSheet.r
df.iris <- iris[,c(2,1,3,4,5)] %>>%
  print()
```

##転置する

転置するにはt()関数を使います。

```r:CheatSheet.r
df.iris <- iris[,c(2,1,3,4,5)] %>>%
  print()
```

##指定した列を取り出す

指定した列を取り出すにはdplyrパッケージのselect()関数を使います。

```r:CheatSheet.r
df.iris <- iris %>>%
  select(Petal.Length,Species) %>>%
  print()
```

条件を絞りこんで抽出したい場合は各要素へのアクセスを大括弧[]で条件を指定します。

```r:CheatSheet.r
df.iris <- df.iris[df.iris$Petal.Width >= 0.3,] %>>%
  print()
```

##ソートする(昇順/降順)

ソートをするにはdplyrパッケージのarrange()関数を使用します。
desc()を使用すると降順でソートされます。
使用しなければ昇順でソートされます。

```r:CheatSheet.r
#昇順でソートする
df.iris <- iris %>>%
  arrange(Petal.Length) %>>%
  print()

#降順でソートする
df.iris <- iris %>>%
  arrange(desc(Petal.Length)) %>>%
  print()
```

##NAの行を除外する

NAの行を削除するにはna.omit()関数を使用します。

```r:CheatSheet.r
df.starwars <- starwars %>>%
  na.omit() %>>%
  print()
```

##NAを別の表現に置き換える

NAを置き換えるにはいくつか方法があります。
対策のひとつめはベクトルで編集した後、列を置き換える方法、対策のふたつめは対象の列における条件を満たしたものに対して置き換える方法です。
ほかにも上手いやり方があったような気がしますが、思い出せません。
思い出したら追記しようかなと思います。

```r:CheatSheet.r
#対策①：ベクトルで編集したあと、列を置き換える
df.starwars_hair_color <- starwars$hair_color
df.starwars_hair_color <- if_else(is.na(df.starwars_hair_color),"None",df.starwars_hair_color)

#既存の列が存在する場合、自動で列が新しいものに置き換わる
df.starwars <- starwars %>>% 
  mutate(hair_color = df.starwars_hair_color) %>>%
  print()
  
#対策②:対象の列における条件を満たしたものに対して置き換える
df.starwars <- starwars
df.starwars$hair_color[is.na(df.starwars$hair_color)] <- "NONE"
```

これらの方法はNAの置き換えだけでなく、特定の値や値に対して補正をかけたい時などにも応用が利くのではないでしょうか。

#グラフ化

##GUIで操作してそれっぽいグラフ化

グラフ化といえばggplot2ですが、GUI操作できるようになるパッケージ「esquisse」があるので、それを使って操作します。
簡単な使い方については[前の記事](https://qiita.com/taro_6974/items/55dc92d30ba569465ca9)でも紹介させていただいたので、参考にしてみてください。
使い方はとっても簡単ですよ！

```r:CheatSheet.r
df.iris <- iris %>>%
  esquisser()
```

#エンコード

##設定中のエンコード情報を確認する

文字化けと戦うのはRプログラマーの宿命だと思うのですが、今設定されているエンコード情報って何だっけ？という方はsys.getlocale()関数を使用しましょう。

```r:CheatSheet.r
Sys.getlocale()
```

##エンコードを元にもどす

あれ、元のエンコード設定って何だっけ？と迷ったときには以下のコードをコピペすると良いと思います。

```r:CheatSheet.r
Sys.setlocale("LC_ALL", '.932')
```

#ファイルの読み込み

##csvファイルを読み込む

csvファイルを読み込むにはR標準で使用できるread.csv()関数か、readrパッケージのread_csv()関数のどちらかを使用しましょう。
下記ではread_csv()関数を使用してcsvファイルを読み込みます。

```r:CheatSheet.r
df.iris <-  read_csv("iris.csv")
```

read.csv()関数を使用した場合は地味に面倒で、長くなってしまったので別途項目を作成の上、後述します。

##stringsAsFactorというおまじない

read.csv関数を使用してcsvファイルを読み込む場合、オプション引数でstringsAsFactorsを指定することができます(デフォルトはTRUEです)。

Rの言語仕様上、データフレームの型はfactor型で解釈したがる特徴がありまして、明示的に指定しない限りfactor型として識別されやすい傾向にあります。

例えば下記のようなコードがあったとします。

```r:CheatSheet.r
#省略でも同様の解釈を行うが、自動でfactor型に変換してしまう
df.iris <- read.csv("iris.csv",stringsAsFactors = T) 

#理想としてはcharactor型だが、factor型で解釈される
is.factor(df.iris$Species)
```

コメントにある通りですが、型がfactor型なのかをtrue/falseでチェックするis.factor()関数でチェックするとFALSEが返ります。

```r:実行結果
> is.factor(df.iris$Species)
[1] TRUE
```

この現象を解決するためには2通りの方法があって、ひとつめはstringsAsFactorsをFALSEで指定すること、もうひとつはread.csv()関数で読み込んだ後、列の要素に対して直接型変換を行う処理をすることです。
stringsAsFactors=FALSEはおまじないだと聞く人は結構多いのではないかと思うのですが、そういうことなんですよね。

```r:CheatSheet.r
#対策①:基本的に明示的にFALSEで処理する
df.iris <- read.csv("iris.csv",stringsAsFactors = F) 

is.factor(df.iris$Species)

#対策②：読み込み処理したあとに型変換を行う
df.iris <- read.csv("iris.csv") 

df.iris$Species <-   as.character(df.iris$Species)

is.factor(df.iris$Species)
```

なお、実行すると以下の結果が得られます。

```r:実行結果
> #対策①:基本的には明示的にFALSEで処理する
> df.iris <- read.csv("iris.csv",stringsAsFactors = F) 
> 
> is.factor(df.iris$Species)
[1] FALSE
> 
> #対策②：読み込み処理したあとに型変換を行う
> df.iris <- read.csv("iris.csv") 
> 
> df.iris$Species <-   as.character(df.iris$Species)
> 
> is.factor(df.iris$Species)
[1] FALSE
```



##エクセルファイルを読み込む

エクセルからファイルを読み込むにはopenxlsxパッケージのread.xlsx()関数を使用します。
注意点として、オプション引数のna.stringsは指定しないと空欄を勝手に解釈して読み込んでしまうため、na.strings=""やna.strings=c("",NULL)などを指定しておくと安全です。

```r:CheatSheet.r
df.starwars <- read.xlsx("starwars.xlsx",na.strings="")
```

#鉄板パッケージのチートシート(日本語訳済のやつ)

hadley神!
彼の開発したパッケージはいずれもデータクレンジングに絶対欠かせないものです。
以下に日本語訳されたチートシートのリンクを貼ります。

・[dplyr/tidyr](https://www.rstudio.com/wp-content/uploads/2015/09/data-wrangling-japanese.pdf)
・[ggplot2](https://www.rstudio.com/wp-content/uploads/2016/10/ggplot2-cheatsheet-2.0-ja.pdf)
・[stringr](https://qiita.com/taro_6974/items/07b4d6b2b741d77989ee)(ここから先は自分が雑に翻訳したやつで)
・[readr](https://qiita.com/taro_6974/items/150454bc9fe260f94b32)(ほんとうに)
・[lubridate](https://qiita.com/taro_6974/items/f236b72dca1533d35afa)(すまない)

#参考

Thanks!

[RStudioではじめるRプログラミング入門](https://www.amazon.co.jp/RStudio%E3%81%A7%E3%81%AF%E3%81%98%E3%82%81%E3%82%8BR%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E5%85%A5%E9%96%80-Garrett-Grolemund/dp/4873117151/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=GOWCUUZUV5QU&keywords=rstudio%E3%81%A7%E3%81%AF%E3%81%98%E3%82%81%E3%82%8Br%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E5%85%A5%E9%96%80&qid=1564449094&s=gateway&sprefix=Rstudio%2Caps%2C260&sr=8-1)

[Rでデータ読み込みから前処理までのTips](https://qiita.com/gigamori/items/0152639dc0a68a400525)