データフレームの内容確認&編集がウィンドウ上で簡単に⁉（DataEditR）

# R上でのデータフレームの内容確認とデータ入力は難しい
Rでデータフレームを処理する場合、データ入力とプレビューをExcel等で行い、その後のデータ処理をRで行うというのが一般的だと思います。

しかし、処理中にエラーが出たためにデータフレーム全体を眺めてザっと問題箇所を発見したい場合などには、いちいちExcelを起動するのはちょっと面倒です。よって、データを`head()`、`tail()`を使ってコマンドライン上で見てみたり、`View()`を使って簡単なビューアで見てみたりしたりしますが、これらの使い勝手はすごく良いとはいえません。

Rはあくまでもインポートしたデータを操作するためのソフト（あるいはプログラミング言語or環境）であるため、表計算ソフトでできるような表をスクロールしながらの内容の確認やデータの入力作業は基本的にできません。これはRStudioも同様です。

この点自分も少し気になっていたのですが、このたび`DataEditR`というパッケージを見つけました。
このパッケージは「R上でデータフレームを表計算ソフトのように操作する」、「R上で表の微細な手直しを行う」などの~~わがまま~~を可能にしてくれるパッケージです。

<img width="300" alt="logo.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535720/a35e349c-4a7a-0b2f-cfa2-bf1f45a47114.png">
> from https://github.com/DillonHammill/DataEditR

vignettesはこちら

https://dillonhammill.github.io/DataEditR/articles/DataEditR.html

大まかな使い方については以下のチュートリアルが分かりやすいです

https://www.business-science.io/code-tools/2021/05/18/dataeditr.html?utm_content=bufferec061&utm_medium=social&utm_source=twitter.com&utm_campaign=buffer

日本語では以下の解説記事がありました。

https://www.salesanalytics.co.jp/datascience/datascience026/

ここでは主に[vignettes](https://dillonhammill.github.io/DataEditR/articles/DataEditR.html)と[Reference](https://dillonhammill.github.io/DataEditR/reference/data_edit.html)をもとにDataEditRがどんな風に使えるか見ていきたいと思います。

# 準備
`DataEditR`はRStudio上で動作するのでRStudioが必要です。
パッケージはCRANからインストール可能です。

```.r
install.packages("DataEditR")
```
使用する際にはlibraryで呼び出します（後述しますがアドインから呼び出すことも可能です）。
※`tidyverse`はここでの解説に使うために呼び出しているもので、`DataEditR`を使うにあたって必須なわけではありません。

```.r
library(DataEditR)
library(tidyverse)
```

# データを見る
`DataEditR`のメインの関数は`data_edit`であり、これを用いてインタラクティブな表操作ウィンドウを呼び出します。
ここでは`tidyr`に入っている`billboard`データセットを見てみたいと思います。

まずはコンソール上に出力した場合

```.r
> billboard
# A tibble: 317 x 79
   artist track date.entered   wk1   wk2   wk3   wk4   wk5   wk6   wk7   wk8   wk9  wk10  wk11
   <chr>  <chr> <date>       <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
 1 2 Pac  Baby~ 2000-02-26      87    82    72    77    87    94    99    NA    NA    NA    NA
 2 2Ge+h~ The ~ 2000-09-02      91    87    92    NA    NA    NA    NA    NA    NA    NA    NA
 3 3 Doo~ Kryp~ 2000-04-08      81    70    68    67    66    57    54    53    51    51    51
 4 3 Doo~ Loser 2000-10-21      76    76    72    69    67    65    55    59    62    61    61
 5 504 B~ Wobb~ 2000-04-15      57    34    25    17    17    31    36    49    53    57    64
 6 98^0   Give~ 2000-08-19      51    39    34    26    26    19     2     2     3     6     7
 7 A*Tee~ Danc~ 2000-07-08      97    97    96    95   100    NA    NA    NA    NA    NA    NA
 8 Aaliy~ I Do~ 2000-01-29      84    62    51    41    38    35    35    38    38    36    37
 9 Aaliy~ Try ~ 2000-03-18      59    53    38    28    21    18    16    14    12    10     9
10 Adams~ Open~ 2000-08-26      76    76    74    69    68    67    61    58    57    59    66
# ... with 307 more rows, and 65 more variables: wk12 <dbl>, wk13 <dbl>, wk14 <dbl>, wk15 <dbl>,
#   wk16 <dbl>, wk17 <dbl>, wk18 <dbl>, wk19 <dbl>, wk20 <dbl>, wk21 <dbl>, wk22 <dbl>,
#   wk23 <dbl>, wk24 <dbl>, wk25 <dbl>, wk26 <dbl>, wk27 <dbl>, wk28 <dbl>, wk29 <dbl>,
#   wk30 <dbl>, wk31 <dbl>, wk32 <dbl>, wk33 <dbl>, wk34 <dbl>, wk35 <dbl>, wk36 <dbl>,
#   wk37 <dbl>, wk38 <dbl>, wk39 <dbl>, wk40 <dbl>, wk41 <dbl>, wk42 <dbl>, wk43 <dbl>,
#   wk44 <dbl>, wk45 <dbl>, wk46 <dbl>, wk47 <dbl>, wk48 <dbl>, wk49 <dbl>, wk50 <dbl>,
#   wk51 <dbl>, wk52 <dbl>, wk53 <dbl>, wk54 <dbl>, wk55 <dbl>, wk56 <dbl>, wk57 <dbl>,
#   wk58 <dbl>, wk59 <dbl>, wk60 <dbl>, wk61 <dbl>, wk62 <dbl>, wk63 <dbl>, wk64 <dbl>,
#   wk65 <dbl>, wk66 <lgl>, wk67 <lgl>, wk68 <lgl>, wk69 <lgl>, wk70 <lgl>, wk71 <lgl>,
#   wk72 <lgl>, wk73 <lgl>, wk74 <lgl>, wk75 <lgl>, wk76 <lgl>
```

Tibble形式なので行はかなり見やすくなっていますが、すべての列はプレビューできません。また、すべての列の概観もできません。
続いて`data_edit`で見てみた場合（警告が出ていますがおおまかな表示の比較用なので今回はスルーしました）

```.r
> billboard %>% data_edit()

Listening on http://127.0.0.1:6987
 警告:  Setting row names on a tibble is deprecated.
 警告:  Setting row names on a tibble is deprecated.
```
![data_edit_normal.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535720/a9f6af6b-00f0-7882-4b46-90ecea4335ea.png)

上のようなダイアログボックスがRStudio上にあらわれます。オプションの`viewer`で`"browser"`を指定するとデフォルトのウェブブラウザで、`"viewer"`あるいは`"pane"`を指定するとRStudioのペイン内にこのウィンドウが表示されます。
上記のウィンドウ内の表はほぼExcel（というかどちらかというとGoogle Spread Sheet）のように操作することができ、セルを選択してカーソル移動することなどで表全体を見たりすることができます。
ただし、ホイールでスクロールしたい場合にはスクロールバー上にカーソルを置いておかないといけなさそうです。ちなみに横スクロールバーは一番下にあります。

# データのインポート
次に、ウィンドウ上で表示するデータの読み込み方を見ていきたいと思います。

## オブジェクトから読み込む
任意のデータフレームオブジェクトからデータを読み込む場合には、上記のように`data_edit`の引数に目的のオブジェクトを指定します。

## データファイルから読み込む
任意のCSVファイル等から読み込む場合には、該当ファイル名を指定し、`read_fun`オプションと`read_args`オプションを適宜指定します。
オプションの指定は必要ないかもしれませんが、エンコードがShift-JISになっており日本語も含まれるデータを読み込む際などには下記のように指定した方がいいかもしれません。

```.r
> data_edit("てすとてんすう.csv", read_fun = "read.csv", read_args = list(fileEncoding = "cp932"))

Listening on http://127.0.0.1:6987
```
![data_edit_nihonngo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535720/0e878b5c-0fc0-5923-230a-0055899b75a5.png)

# データの編集
`data_edit`で開かれたウィンドウ上では、これもExcelなどと同様に任意のセルを選択し、編集することが可能です。もちろん列名も編集できます。またオートフィル機能もあるため、同じ数字を一気に入力することもできます。

また便利機能として、列の選択と行のフィルタリングを行うことも可能です。
列の選択（セレクト）はこんな感じ。
![data_edit_select.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535720/a037e9ad-d542-ef7a-1c5b-24c9d3c69c59.png)
行の選択（フィルター）はこんな感じ（基準値は「Add ○○..」をクリックして追加する必要があります）。
![data_edit_filter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535720/cd768dad-1730-9abb-f15a-5530cd6f7901.png)
そうするとこんな風になります。
![data_edit_selectfilter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535720/9d88eb6e-21e4-82d6-df28-eb5fb56a7e8f.png)

ちなみに「セレクト」や「フィルター」では`dplyr::select`や`dplyr::filter`を呼び出して使っているわけではないようです（cf. GitHub上のコード）。

# 編集した表の保存
セルの編集や列選択、行選択をした表はハサミマークの「crop to selection」を押して「Done」を押すことで編集を確定させることができます。
保存先は`data_edit`実行時の書式によって指定可能です。
## オブジェクトに格納する場合
単に`data_edit`の出力結果を`<-`でオブジェクトに格納することで、編集後データを記録可能です。

```.r
> billboard %>% data_edit() -> billboard2

Listening on http://127.0.0.1:6987
 警告:  Setting row names on a tibble is deprecated.
 警告:  Setting row names on a tibble is deprecated.
 警告:  Setting row names on a tibble is deprecated.
 警告:  Setting row names on a tibble is deprecated.
 警告:  Setting row names on a tibble is deprecated.
 警告:  Setting row names on a tibble is deprecated.
later: interrupt occurred while executing callback.

later: interrupt occurred while executing callback.
# 上記例の列選択と行選択を実行

> billboard2 %>% head()
        artist                   track date.entered wk1
1        2 Pac Baby Don't Cry (Keep...   2000-02-26  87
2      2Ge+her The Hardest Part Of ...   2000-09-02  91
3 3 Doors Down              Kryptonite   2000-04-08  81
4 3 Doors Down                   Loser   2000-10-21  76
5     504 Boyz           Wobble Wobble   2000-04-15  57
6         98^0 Give Me Just One Nig...   2000-08-19  51
```

## ファイルに出力する場合
オプションの`save_as`、`write_fun`、`write_args`を適宜指定することでファイルに出力可能です。

```.r
> billboard %>% data_edit(save_as = "billboard2.csv", write_fun = "write.csv", write_args = list(fileEncoding = "cp932"))

Listening on http://127.0.0.1:6987
 警告:  Setting row names on a tibble is deprecated.
 警告:  Setting row names on a tibble is deprecated.
 警告:  Setting row names on a tibble is deprecated.
 警告:  Setting row names on a tibble is deprecated.
 警告:  Setting row names on a tibble is deprecated.
 警告:  Setting row names on a tibble is deprecated.
                      artist                   track date.entered wk1
1                      2 Pac Baby Don't Cry (Keep...   2000-02-26  87
2                    2Ge+her The Hardest Part Of ...   2000-09-02  91
3               3 Doors Down              Kryptonite   2000-04-08  81
4               3 Doors Down                   Loser   2000-10-21  76
5                   504 Boyz           Wobble Wobble   2000-04-15  57
(以下略)
```
![billboard2csv.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535720/09e32126-303a-db84-5417-71b7546d4314.png)

## オブジェクトにもファイルにも保存する
オブジェクトにデータを格納し、データをファイルにも出力する場合には、上記の方法を組み合わせればOKです。格納先オブジェクトおよび出力先ファイルを指定します。

```.r
> billboard %>% data_edit(save_as = "billboard2.csv", write_fun = "write.csv", write_args = list(fileEncoding = "cp932")) -> billboard2

Listening on http://127.0.0.1:6987
 警告:  Setting row names on a tibble is deprecated.
 警告:  Setting row names on a tibble is deprecated.
 警告:  Setting row names on a tibble is deprecated.
 警告:  Setting row names on a tibble is deprecated.
 警告:  Setting row names on a tibble is deprecated.
 警告:  Setting row names on a tibble is deprecated.
later: interrupt occurred while executing callback.

later: interrupt occurred while executing callback.
> billboard2 %>% head()
        artist                   track date.entered wk1
1        2 Pac Baby Don't Cry (Keep...   2000-02-26  87
2      2Ge+her The Hardest Part Of ...   2000-09-02  91
3 3 Doors Down              Kryptonite   2000-04-08  81
4 3 Doors Down                   Loser   2000-10-21  76
5     504 Boyz           Wobble Wobble   2000-04-15  57
6         98^0 Give Me Just One Nig...   2000-08-19  51
```

また、ウィンドウ上の「save selection to file」や「save to file」を使用することでもファイルへの出力が可能です。

# 新規の表の作成
`data_edit`を使用すると、なんと空の表を作成し、データ入力を行うこともできます。
下図のようにセル選択後に右クリックをすることで行および列を挿入、追加することも可能です（もちろん既存のデータへの行、列の追加も可能）。

```.r
> new_data <- data_edit(c(2, 3))

Listening on http://127.0.0.1:6987
```
![data_edit_blanc2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535720/25d53b74-fdf9-1bcb-5122-4901691d610c.png)




# その他の機能
その他`col_*`オプションを指定することで列のさまざまなコントロールが可能です。
`col_readonly`：指定した列を編集できないように保護する
`col_bind`：列として新規結合するデータの指定。あるいはリストで新規列名を指定して新規空列を作成
`col_options`：`col_bind`で作成した空列の入力時に、dropdown menus（セルの値をいくつかの選択肢から選択して入力可能）、 dates（カレンダーから日付を入力可能）, checkboxes（TRUE/FALSEをチェックリスト形式で入力可能）、passwords（データ入力時に不可視化）等の機能を使うか否か
※詳しくは公式のvignettesを見ていただきたいのですが、これらの機能は***とても便利です***

```.r
> test_data <- data.frame(id = 1:10, sp = rep(c("A", "B"), 5), site = rep(c("x1", "x2", "x3", "x4", "x5"), 2))
> test_data <- data_edit(test_data, col_bind = c("date", "picture"), col_options = list(date = "date", picture = c(TRUE, FALSE)))

Listening on http://127.0.0.1:6987
Column editing is turned off to add complex column types...
```
![data_edit_coloptions.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535720/449968d4-a062-9144-d3d1-eaf9b705b759.png)
などなど

また`code`オプションというのもあるのですが、これは編集履歴を残しておくようなものではないようなのでその点には注意です。

# アドインでの呼び出し
なんとRStudioにはこのData Editorのアドインがあります。スクリプト上のデータフレーム名を選択してアドインを呼び出すなどの方法で、ウィンドウ上にデータを表示させることができます。
![data_edit_adin1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535720/fbee9352-d8f7-c12e-b843-caff46b683c1.png)
![data_edit_adin2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535720/d05af497-93f1-59fd-c2af-53dd160cd3f3.png)



# データフレームの内容確認にとても便利！
このように`DataEditR`は非常に便利な表（データフレーム）操作環境を提供してくれます。
データを概観するという観点からはRStudio上のビューアも十分便利なのですが、やはり一歩踏み込んだ操作性の高さがGoodだと思います。


特に列数が多いデータフレーム（今回用いた`billboard`のようなもの）や行数が多いデータフレーム（`ggplot2::diamonds`のようなもの）など、コマンドライン上でデータの大まかな様子の確認を行うのに無理があるデータを見るときに非常に便利だろうと思います。ただし、あまりに大きなデータだと動作が重くなりそうなので、適宜`head`とかで行数を減らして`data_edit`に渡すのがいいかもしれません（`diamonds`をそのまま表示しようとすると止まりました）。

個人的にはデータの入力はExcelで済ませて、データの編集はコマンドで記録しておく派なので、編集機能はあまり使わないかもしれませんが、本当に便利なパッケージだと思います！（とくにアドオンがめっちゃ便利！）