備忘ログ

チラシの裏的備忘録&メモ

RでNULLがis.numeric()でTRUEになるとき

Rをいじっているときに、NANULLなどを選別するために、それを個別に判別するためにはis.na()や、is.null()など(汎用的なis.finite()なども便利)をつかうことがある。NULLはちょっと変わっているので判別できたりできなかったりするが。

is.na(NA)
## [1] TRUE
is.na(NULL)
## logical(0)
is.null(NA)
## [1] FALSE
is.null(NULL)
## [1] TRUE

NANULLなどと例えば数値型を選別したいときには個別に判別しなくてもis.numeric()で判別すると、NANULLなんかはFALSEになるので判別できて重宝する。

is.numeric(123)
## [1] TRUE
is.numeric(NA)
## [1] FALSE
is.numeric(NULL)
## [1] FALSE

しかし、NANULLis.numeric()でTRUEになることがある。それはas.numeric()でデータ型を変換したときに起こる。

is.numeric(as.numeric(NA))
## [1] TRUE
is.numeric(as.numeric(NULL))
## [1] TRUE

型を書き換えているからそうなるんだと言われればそうなのだが、NAはNAなんだからNAのままでいてほしかった(君はキミのままでいてほしい的なやつ)。

で、これはそうなんだろうなとおもうのだけれど、as.numeric()で文字列を強制変換して作成されたNAでも同じことになるので時々びっくりする。

# 文字列はis.numeric()では当然FALSEになる
is.numeric("MOJI")
## [1] FALSE
# as.numeric()で強制的にNAに変換したとき、それはNAでありながら数字型になっている
is.numeric(as.numeric("MOJI"))
## Warning: 強制変換により NA が生成されました

## [1] TRUE
# オブジェクトでもそうなる
a <- "MOJIRETU"
a <- as.numeric(a)
## Warning: 強制変換により NA が生成されました
a
## [1] NA
is.numeric(a)
## [1] TRUE

/)( ◕ ‿‿ ◕ )(\わけがわからないよ

って気持ちになる。 (この間まどマギ10周年のニュースを見て、もう10年前かと感慨深くなった)

自分で任意で書き換えたデータ型なので注意していればいいのかもしれないがぼさっとしているとびっくりする。初めて遭遇したときはバグか?と思う。

そもそも、NAとかのデータ型が書き換えられるなんて、ただ、文字列はNAに変換してほしいって祈っただけなのに

「こんなの絶対おかしいよ」

って気持ちなる。

でも自分でas.numeric()を唱えた結果だと知って

「あたしってほんとバカ」

って気持ちになる。

以上、まどマギももう10年なんだなぁという話でした。

以上、as.*()系はデータ型を書き換える処理が(意図する意図しないに関わらず)普通に行われるので要注意という話でした。