データフレームの missing の置換
Julia の Query で,データフレームのとある列の missing
を別の値に置換したい場合,変数名を指定するとうまく行かない。
以下のようなデータフレームを例に取る。
using DataFrames
using Query
df = DataFrame(a=[1, 2, missing, 4, 5], b=11:15)
Row | a | b |
---|---|---|
Int64? | Int64 | |
1 | 1 | 11 |
2 | 2 | 12 |
3 | missing | 13 |
4 | 4 | 14 |
5 | 5 | 15 |
a 列にある missing
を定数値で置き換えるのは難なくできる。
df |>
@replacena(:a => 12345) |>
DataFrame
Row | a | b |
---|---|---|
Int64 | Int64 | |
1 | 1 | 11 |
2 | 2 | 12 |
3 | 12345 | 13 |
4 | 4 | 14 |
5 | 5 | 15 |
しかし,置き換えるべきものが変数に格納されているときには,そうは行かない。
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)
この,回りくどい方法でやっと,目的地にたどり着くことができた。
注意すべきことは「とりあえずの数値」を適切に選ぶ必要がある。本来その列に存在しない値を選ばなければならない。
replacevalue = 12345
df |>
# @replacena(:a => replacevalue) |> エラーになる。変数名は指定できない。ので,以下の 3 行でやる。
@replacena(:a => 99999) |>
@mutate(a = _.a == 99999 ? replacevalue : _.a) |>
DataFrame
Row | a | b |
---|---|---|
Any | Any | |
1 | 1 | 11 |
2 | 2 | 12 |
3 | 12345 | 13 |
4 | 4 | 14 |
5 | 5 | 15 |
ということで,目出度く a 列の missing
は replacevalue = 12345
に変更された。
他に解決策はないのだろうか。