はじめに
題名がすべてですが、data.table
の中にあるNAをすべて0にしたいと思ったのですが、変なところにハマったので、備忘録代わりに書きます。
data.frameなら一発?
{dplyr}のパイプの中でNAを0に置換するの中で、data.frame
中に含まれるNAを一括で0にするには、下記のコードで一発だそうです。
NAの一括変換
df[is.na(df)] <- 0
ところが、data.table
に適用するとエラーが出てしまいます。
data.tableの失敗例
dt[is.na(dt)] <- 0
エラー: Must use a vector in `[`, not an object of class matrix.
どうやら、is.na(dt)
が配列として解釈されるのがだめっぽい。なぜだろう。意味がないと思いつつ、dt[,is.na(dt)]
としてもdt[is.na(dt),] としてもだめだった。
dplyrを使った変換
先程ご紹介した記事だと、dplyr
を使った例も提示されている。
dplyrを使った例
dt %>%
mutate_all(funs(ifelse(is.na(.),0,.)))
これで行けるのだが、最新バージョンだとfuns()
はdeprecatedだよ、と怒られるようになったので、ラムダ式を使った方法にするとよい。
ラムダ式を使った例
dt %>%
mutate_all(~ifelse(is.na(.),0,.))
なんかもっと方法がある気もするが、この方法だと、記事中にあるようにmutate_at
とかも使えて応用が効くので知っていて損はない。