データフレームの missing の置換

# データフレームの missing の置換

Julia の Query で，データフレームのとある列の `missing` を別の値に置換したい場合，変数名を指定するとうまく行かない。

以下のようなデータフレームを例に取る。


```julia
using DataFrames
using Query

df = DataFrame(a=[1, 2, missing, 4, 5], b=11:15)
```




<div><div style = "float: left;"><span>5×2 DataFrame</span></div><div style = "clear: both;"></div></div><div class = "data-frame" style = "overflow-x: scroll;"><table class = "data-frame" style = "margin-bottom: 6px;"><thead><tr class = "header"><th class = "rowNumber" style = "font-weight: bold; text-align: right;">Row</th><th style = "text-align: left;">a</th><th style = "text-align: left;">b</th></tr><tr class = "subheader headerLastRow"><th class = "rowNumber" style = "font-weight: bold; text-align: right;"></th><th title = "Union{Missing, Int64}" style = "text-align: left;">Int64?</th><th title = "Int64" style = "text-align: left;">Int64</th></tr></thead><tbody><tr><td class = "rowNumber" style = "font-weight: bold; text-align: right;">1</td><td style = "text-align: right;">1</td><td style = "text-align: right;">11</td></tr><tr><td class = "rowNumber" style = "font-weight: bold; text-align: right;">2</td><td style = "text-align: right;">2</td><td style = "text-align: right;">12</td></tr><tr><td class = "rowNumber" style = "font-weight: bold; text-align: right;">3</td><td style = "font-style: italic; text-align: right;">missing</td><td style = "text-align: right;">13</td></tr><tr><td class = "rowNumber" style = "font-weight: bold; text-align: right;">4</td><td style = "text-align: right;">4</td><td style = "text-align: right;">14</td></tr><tr><td class = "rowNumber" style = "font-weight: bold; text-align: right;">5</td><td style = "text-align: right;">5</td><td style = "text-align: right;">15</td></tr></tbody></table></div>



a 列にある `missing` を定数値で置き換えるのは難なくできる。


```julia
df |>
    @replacena(:a => 12345) |>
    DataFrame

```




<div><div style = "float: left;"><span>5×2 DataFrame</span></div><div style = "clear: both;"></div></div><div class = "data-frame" style = "overflow-x: scroll;"><table class = "data-frame" style = "margin-bottom: 6px;"><thead><tr class = "header"><th class = "rowNumber" style = "font-weight: bold; text-align: right;">Row</th><th style = "text-align: left;">a</th><th style = "text-align: left;">b</th></tr><tr class = "subheader headerLastRow"><th class = "rowNumber" style = "font-weight: bold; text-align: right;"></th><th title = "Int64" style = "text-align: left;">Int64</th><th title = "Int64" style = "text-align: left;">Int64</th></tr></thead><tbody><tr><td class = "rowNumber" style = "font-weight: bold; text-align: right;">1</td><td style = "text-align: right;">1</td><td style = "text-align: right;">11</td></tr><tr><td class = "rowNumber" style = "font-weight: bold; text-align: right;">2</td><td style = "text-align: right;">2</td><td style = "text-align: right;">12</td></tr><tr><td class = "rowNumber" style = "font-weight: bold; text-align: right;">3</td><td style = "text-align: right;">12345</td><td style = "text-align: right;">13</td></tr><tr><td class = "rowNumber" style = "font-weight: bold; text-align: right;">4</td><td style = "text-align: right;">4</td><td style = "text-align: right;">14</td></tr><tr><td class = "rowNumber" style = "font-weight: bold; text-align: right;">5</td><td style = "text-align: right;">5</td><td style = "text-align: right;">15</td></tr></tbody></table></div>



しかし，置き換えるべきものが変数に格納されているときには，そうは行かない。


```julia
replacevalue = 12345
df |>
    @replacena(:a => replacevalue) |>
    DataFrame
```


    UndefVarError: replacevalue not defined

    以下略



あれこれやってみたり，検索したりしても
https://discourse.julialang.org/t/replacena-not-working-with-variables-as-replacement-value/45401
でも，結局結論は出ていないようだ。有耶無耶になっているのかなあ。

そこで色々やってみた。

まずは，目的の列の `missing` を「とりあえずの数値」に置き換える。

`@replacena(:a => 99999)`

次に，「とりあえずの数値」を本来望むべき値を持つ列の値で置き換える。

`@mutate(a=_.a == 99999 ? replacevalue : _.a)`

この，回りくどい方法でやっと，目的地にたどり着くことができた。

注意すべきことは「とりあえずの数値」を適切に選ぶ必要がある。本来その列に存在しない値を選ばなければならない。


```julia
replacevalue = 12345
df |>
    # @replacena(:a => replacevalue) |> エラーになる。変数名は指定できない。ので，以下の 3 行でやる。
    @replacena(:a => 99999) |>
    @mutate(a = _.a == 99999 ? replacevalue : _.a) |>
    DataFrame
```




<div><div style = "float: left;"><span>5×2 DataFrame</span></div><div style = "clear: both;"></div></div><div class = "data-frame" style = "overflow-x: scroll;"><table class = "data-frame" style = "margin-bottom: 6px;"><thead><tr class = "header"><th class = "rowNumber" style = "font-weight: bold; text-align: right;">Row</th><th style = "text-align: left;">a</th><th style = "text-align: left;">b</th></tr><tr class = "subheader headerLastRow"><th class = "rowNumber" style = "font-weight: bold; text-align: right;"></th><th title = "Any" style = "text-align: left;">Any</th><th title = "Any" style = "text-align: left;">Any</th></tr></thead><tbody><tr><td class = "rowNumber" style = "font-weight: bold; text-align: right;">1</td><td style = "text-align: left;">1</td><td style = "text-align: left;">11</td></tr><tr><td class = "rowNumber" style = "font-weight: bold; text-align: right;">2</td><td style = "text-align: left;">2</td><td style = "text-align: left;">12</td></tr><tr><td class = "rowNumber" style = "font-weight: bold; text-align: right;">3</td><td style = "text-align: left;">12345</td><td style = "text-align: left;">13</td></tr><tr><td class = "rowNumber" style = "font-weight: bold; text-align: right;">4</td><td style = "text-align: left;">4</td><td style = "text-align: left;">14</td></tr><tr><td class = "rowNumber" style = "font-weight: bold; text-align: right;">5</td><td style = "text-align: left;">5</td><td style = "text-align: left;">15</td></tr></tbody></table></div>



ということで，目出度く a 列の `missing` は `replacevalue = 12345` に変更された。

他に解決策はないのだろうか。