R初学者からよく質問されること

この記事は[R Advent Calender 2016](http://qiita.com/advent-calendar/2016/r-rstudio)の16日目の記事です。

##　はじめに
- データ分析にRとPythonを普段使っています。
- ここ数年でRを使って、データ分析を教えてる際に、同じようなことを前に誰かに聞かれてっていうのがあるのでちゃんとまとめておこうと思います。
- とくにRの技術的なことは解説しないので、あるあるだなーと思って頂ければ幸いです。

## 質問集

### なんでRを使うのですか?

ちょっと古い記事ですが、[Choosing R or Python for data analysis? An infographic](https://www.datacamp.com/community/tutorials/r-or-python-for-data-analysis#gs.GQi4188)など、色々な意見がある中で個人的に説明するときは、

- 再現性の確保
- RStudioの機能性
- Pythonより、Rのほうがプログラミングという感覚が少なく、プログラミングが苦手な方にも入りやすそうだったから
- 関数が豊富で、データ入力〜可視化までのコードを書くと結果的に見やすくなる（これは私だけかもですが…）

ただ、機械学習をがっつり実装するとなると、コーディングがメインになるのでPythonをお勧めするというイメージです。

### あるCSVデータを入力したい

CSVデータを読む出すときに、**read.csv** はもちろんですが、実問題だと大きなCSVファイルが多いので、速度の点で、**fread** を勧めています。

ただ、1点問題なのが、デフォルトだと **data.table** で読んでしまい、一般的な **data.frame** と混ざって初学者をややこしくしてしまうので、**fread(data.table=F)** にして利用してます。**readr::read_csv()** も選択肢ですが、速度優先で使っています。

### CSVファイルが複数あるので、一度に読みたい

ここらへんから、R初学者にはちょっと面倒になってきますね。forループを使わずに書くのに慣れてもらうのに **apply**　系は必須です（といっても、ここで挫折してもらわないためにも、はじめはforで書くのでも良いのですが）

[Importing multiple .csv files into R](http://stackoverflow.com/questions/11433432/importing-multiple-csv-files-into-r)のとおりで、 **list.files** でファイルリストを作って、 **lapply**関数で引数に与えたファイルリストで繰り返し処理し、**fread** でデータを読み込んだdata.frame形式をlist形式でまとめて保存する。その後、　**do.call**　でまとめて　**rbind** でくっつける処理を行う。

```
files = list.files(pattern="*.csv")
df = do.call(rbind, lapply(files, function(x) fread(x,data.table=F)))
```

### データ操作は？

後にも先にも、 **dplyr** です。そして、**%>%** の便利さです。

さらに最近は、[tidyverse](https://blog.rstudio.org/2016/09/15/tidyverse-1-0-0/) でまとめてインストールできるのが良いですね。

この辺は解説記事が山ほどあるので、私の方ではほとんど解説なしです、すいません。。

### 変数名の命名規則は？(コーディングスタイル)

RStudioを使う前提ですが、右上のEnviroment謎の変数がいろいろでき上がってきます。

一定の命名規則をもたせればいいと思うのですが、データフレームなら、dfやdataを頭につけて、.でつなげるとかを決めればいいと思います(例　: df.12gatu.value)

おすすめは、以下の通りがあるので、それをもとに作っています。

- [Google's R Style Guide](https://google.github.io/styleguide/Rguide.xml)
- [Style guide by Hadley Wickham](http://adv-r.had.co.nz/Style.html)

### 縦持ちデータと横持ちデータのやりとり

といっても、やはりエクセルに慣れた方は、これにまずハマります。ある列で集計するようなことをするなら、データの持ち方を変更する必要があるからです。

[reshape2](https://heavywatal.github.io/rstats/reshape2.html) と [tidyr](https://heavywatal.github.io/rstats/tidyr.html)がありますが、今ならどっちが人気なんですかね。。周りは今でもreshape2を使う方が多いイメージです。

### grouped_df の挙動

**dplyr::group_by** の後に **dplyr::summarize()** で集計した結果をdata.frameに入れて、再度操作することがあります。

そうすると、grouped_dfのせいでうまく操作ができないことがあります。

```
> head(aaa)
Source: local data frame [6 x 3]
Groups: k, filename [1]

      k          filename mean_num
  <chr>             <chr>    <dbl>
1  k=02 default_cleansing  2998.71
2  k=02 default_cleansing  3503.85
<snip>

> class(aaa)
[1] "grouped_df" "tbl_df"     "tbl"        "data.frame"
```

こんな aaa に対して、不要な列を消そうとすると、grouped_dfのせいで消せない。。


```
aaa %>% dplyr::select(-k) -> bbb
Adding missing grouping variables: `k`
> head(bbb)
Source: local data frame [6 x 3]
Groups: k, filename [1]

      k          filename mean_num
  <chr>             <chr>    <dbl>
1  k=02 default_cleansing  2998.71
2  k=02 default_cleansing  3503.85
<snip>
```

こういうときに、**ungroup()** を使うとgroup化されてる変数情報を削除できるので普通に扱えるようになります。

```
> aaa %>%
+   dplyr::ungroup() %>%
+   dplyr::select(-k) -> bbb
> head(bbb)
# A tibble: 6 × 2
           filename mean_num
              <chr>    <dbl>
1 default_cleansing  2998.71
2 default_cleansing  3503.85
<snip>
> class(bbb)
[1] "tbl_df"     "tbl"        "data.frame"
```

ただ、これよく使っている割には、どういったときに起こるのか、これが本当に正しい使い方なのかは正直わかりません。。

### データの可視化は？

やはり [**ggplot2**](http://docs.ggplot2.org/current/) も今年一番使ったパッケージでした。バージョンが2になったのがちょうど２０１５年１２月のこの時期くらいだったので、今年１年さらに便利に使わせてもらいました。

さらに、今年は [**plotly**](https://plot.ly/r/getting-started/) もオンプレ環境でも使えるようになり、インタラクティブな可視化ができるので使っていたのですが、まだできることがggplotに比べて少ないので、これからに期待しています。

ggplotの使い方も山ほど解説記事があるので省略します（省略ばかりすいません）

### ＲStudioのショートカット（Mac)

[Keyboard Shortcuts](https://support.rstudio.com/hc/en-us/articles/200711853-Keyboard-Shortcuts)を参考にします(かなりの量がありますが、どこまでみんな使っているんですかね…)が、個人的によく使うものは大体ファイル編集しているときで以下くらいかなと思います。

- カーソルがある行のコメントアウト : ``` cmd + shift + c ```
    - 選択範囲で実行すると、一斉コメントアウトできる
- ファイル編集で左タブ移動 ： ```ctl + option + LEFT```  
- ファイル編集で右タブ移動 ： ```ctl + option + RIGHT```
- カーソルがある行を実行 ： ```ctl + option + RIGHT```
    - 選択範囲でもできる
- Rmdのチャンク内を実行 ： ```cmd + option + c```


### Rmdでレポート化

Rの強みかなと思うのは、Rmdで書いておけば、そのままHTMLレポートを出力できて、メールに貼り付けて送るってこともできるので重宝します。

Rスクリプトとの区別は、Rmdはあくまで分析レポート。探索的な処理や関数とかはRスクリプトで書くようにしていますが、混ざることもあるので、明確に使い分けるの難しいです。

さらに最近は、結果を見ながら分析を進めれるという点で、[R notebooks](http://rmarkdown.rstudio.com/r_notebooks.html)も布教していきたいと思います。


### Viewは危険

RStudioは直感的に、変数の中身見れるのですが、大きなデータフレームをクリックして開こうとすると固まりますよね。初学者はこれをやってしまって、取り消そうと思ったら、RStudioがクラッシュして、saveしてなかったファイルが消えるという事故が多発します。。

大きなファイルを開くときは、```View(head(df))``` をするように言っているのですが、これってデフォルトで何か制御できる？んですかね。知っていたら教えてほしいです。

### 表を作って、htmlレポートに入れたい

**DT::datatable** で簡単に data.frame形式の変数を表に出せるので、使っています。

```
DT::datatable(iris)
```

![image](https://qiita-image-store.s3.amazonaws.com/0/69266/8973641e-c057-3789-6c65-6bb7cf490dd5.png)

以前は、**xtable** も使っていましたが、今は気軽さと検索ができるので、datatableを使っています。


### 寝ている間に処理を進めたい

最終的にRStudioで書いたRmdのコードをより大きなファイルで動かしたい場合、寝ている間に実行しておきたいなとなり、Rが入ってる環境で、以下のコマンドでバックグラウンド実行します。

```
$ Rscript -e 'rmarkdown::render("test.Rmd", output_file="test.html”)'
```

これで寝ている間にtest.htmlファイルが出来上がってレポートができているはずです。


## おわりに
- 担当日に思い出しながら書いたもので、完成度や網羅性がいまいちなので、また順次追加していきたいと思います。
- 今年もRの発展で、データ分析のしやすさはもちろんですが、特にアウトプットを意識したレポート化（[flexdashboard](http://rmarkdown.rstudio.com/flexdashboard/)）やより柔軟な可視化がしやすくなった1年だったなと思います。来年もR Enjoyしていきます。