Rのデータセットを読み込むRubyのGemを作ったった

タイトルの通りです。RubyからRのデータセットを読み込むGemを作りました。
R言語パッケージに含まれている約1,200のデータセットを利用することができます。
https://github.com/kojix2/rdatasets

Rのデータセットの元データはこちらです。
https://github.com/vincentarelbundock/Rdatasets

## インストール
```bash
gem install rdatasets
```
* 必要なもの
  * [Daru](https://github.com/SciRuby/daru) データフレームオブジェクトを提供するライブラリ

## 使い方
####iris（アヤメの計測データ）のデータセットを読み込む

```ruby
require 'radatasets'

iris = RDatasets.load(:datasets, :iris)
iris = Daru::DataFrame.from_rdatasets(:datasets, :iris)
```

irisのデータが読み込まれ、Daru::DataFrameが作成されます。

```ruby
=> #<Daru::DataFrame(150x5)>
            Sepal.Leng Sepal.Widt Petal.Leng Petal.Widt    Species
          1        5.1        3.5        1.4        0.2     setosa
          2        4.9          3        1.4        0.2     setosa
          3        4.7        3.2        1.3        0.2     setosa
          4        4.6        3.1        1.5        0.2     setosa
          5          5        3.6        1.4        0.2     setosa
          6        5.4        3.9        1.7        0.4     setosa
          7        4.6        3.4        1.4        0.3     setosa
          8          5        3.4        1.5        0.2     setosa
          9        4.4        2.9        1.4        0.2     setosa
         10        4.9        3.1        1.5        0.1     setosa
         11        5.4        3.7        1.5        0.2     setosa
         12        4.8        3.4        1.6        0.2     setosa
         13        4.8          3        1.4        0.1     setosa
         14        4.3          3        1.1        0.1     setosa
         15        5.8          4        1.2        0.2     setosa
        ...        ...        ...        ...        ...        ...
```

Jupyter Lab + IRuby では次のように表示されます。
![iris.png](https://qiita-image-store.s3.amazonaws.com/0/144608/87cf19f9-8b2d-0dc8-d6fa-97caef5b1759.png)


#### タイタニックのデータセットを読み込む

```ruby
titanic = RDatasets.load :datasets, :Titanic
# => #<Daru::DataFrame(32x5)>
             Class      Sex      Age Survived     Freq
        1      1st     Male    Child       No        0
        2      2nd     Male    Child       No        0
        3      3rd     Male    Child       No       35
        4     Crew     Male    Child       No        0
        5      1st   Female    Child       No        0
        6      2nd   Female    Child       No        0
        7      3rd   Female    Child       No       17
        8     Crew   Female    Child       No        0
        9      1st     Male    Adult       No      118
       10      2nd     Male    Adult       No      154
       11      3rd     Male    Adult       No      387
       12     Crew     Male    Adult       No      670
       13      1st   Female    Adult       No        4
       14      2nd   Female    Adult       No       13
       15      3rd   Female    Adult       No       89
      ...      ...      ...      ...      ...      ...
```

一応メソッドチェーンでも呼び出せます。


```ruby
iris = RDatasets.datasets.iris
titanic = RDatasets.datasets.Titanic
```

#### 使用できるパッケージのリストを表示する

```ruby
RDatasets.packages

#=> [:boot, :carData, :cluster, :COUNT, :DAAG, :datasets, :drc, :Ecdat, :evir, :forecast, 
# :fpp2, :gamclass, :gap, :geepack, :ggplot2, :HistData, :HSAUR, :hwde, :ISLR, :KMsurv, 
# :lattice, :lme4, :lmec, :MASS, :mediation, :mi, :mosaicData, :multgee, :plm, :plyr, 
# :pscl, :psych, :quantreg, :reshape2, :robustbase, :rpart, :sandwich, :sem, :Stat2Data, 
# :survival, :texmex, :vcd, :Zelig]
```

#### あるパッケージで利用できるデータセットのリストを表示する

```ruby
RDatasets.packages :survival

# => [:bladder, :cancer, :cgd, :colon, :flchain, :genfan, :heart, :kidney, :leukemia, 
# :logan, :lung, :mgus, :mgus2, :myeloid, :nwtco, :ovarian, :pbc, :rats, :retinopathy, 
# :rhDNase, :solder, :stanford2, :tobin, :transplant, :uspop2, :veteran]

# 打ち損じでデータの読み込みが失敗したときのために、load(package_name)でもデータセットのリストは表示できる
RDatasets.load :datasets, :hogehoge
# => エラー (No such file or directory
RDatasets.load :datasets
# => [:"ability.cov", :airmiles, :AirPassengers, :airquality, :anscombe ...以下略
```

#### 全データセットのリストを取得する

```ruby
RDatasets.df
# => Daru::DataFrame
```

Jupyter Lab + IRuby カーネルでは以下のように表示されます。
![daru.png](https://qiita-image-store.s3.amazonaws.com/0/144608/b4658a09-62d7-98d1-69be-ca5cc72a24f8.png)

特定のデータセットを検索することもできます。

```ruby
RDatasets.search "diamond"     # 大文字、小文字は無視される
RDatasets.search /diamond/     # 正規表現
```

## 説明
　このGemはRubyからデータセットを簡単に読み込む方法がないので作成しました。JuliaからRのデータセットを読み込むパッケージの [RDatasets.jl](https://github.com/johnmyleswhite/RDatasets.jl) が便利そうだったので、これを真似して作りました。Rのデータセットは[Vincentさんの作成したレポジトリ](https://github.com/vincentarelbundock/Rdatasets)のRのデータセットから移植しました。 
　内部では `data` フォルダに格納してあるCSVファイルを `Daru::DataFrame.from_csv` で読み込むだけ、という簡単な仕組みです。RubyはGemの作成時に`data`ディレクトリを`tar.gz`に自動で圧縮してくれます。それでもgemのサイズは約23.6MBと少し大きめです。
　配布元より[RのデータセットのライセンスはGPL3](https://github.com/vincentarelbundock/Rdatasets#license)と仮定されています。詳しくはリンクをご覧ください。

## 感謝
* Vincent Arel-Bundock
    * Rのデータセットを収載したレポジトリ [Rdatasets](https://github.com/vincentarelbundock/Rdatasets)　の作者。
* John Myles White
    * [RDatasets.jl](https://github.com/johnmyleswhite/RDatasets.jl) の作者。


## 貢献
　当方エンジニアではなく、ほとんど雰囲気で書いているため、よく見ると‥よく見なくても‥コードがおかしいところがあるかもしれません。そういう時は`プルリクエスト`という形でやさしく教えてくれると助かります。しかし全体的にはそういった点を差し引いても便利なgemになっているのではないかな、と思います。あと全体的にRubyを使ったデータ解析の集合知がまだ足りなくて、ググっても求める結果がなかなか見つからないことが多いですね。だから rdatasets, Daru、SVMKit、NArray、IRubyなどを使用したら、ぜひ感想を自分の`ブログ`にでも書いてください。きっとあとから同じことをやろうとする人の役に立つと思います。