Help us understand the problem. What is going on with this article?

Rでdata.table中のNAを0に変換する

More than 1 year has passed since last update.

はじめに

題名がすべてですが、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とかも使えて応用が効くので知っていて損はない。

yasyas
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away