NULL (何も無い) ,NA (欠損値) ,NaN (非数) ,Inf (無限大) は,大抵は演算を施してもそのままの値( NA や NAN )が返ってくる.すなわち,原則として NaN にどのような演算を施しても結果は NaN になる.よって,比較演算子 == すら使えないことになる.
x <- c(1.0, NA, 3.0, 4.0) # NA はどれかを調べても... x == NA # NA に対する演算は全て NA となる [1] NA NA NA |
これら 4 つの値の検査を行う関数がそれぞれ用意されている.
命令 |
is.null() |
is.na() |
is.nan() |
is.finite() |
is.infinite() |
complete.cases() |
対象 |
NULLか否か |
NAか否か |
NaNか否か |
有限か否か |
無限か否か |
欠損か否か |
例えば,ある値が NA かどうかのテストは関数 is.na() で行なう (比較演算子 == では行なえないことに注意) が,これは NaN を代入しても TRUE が返ってしまう.そこで NaN か否か (NA か否かではない) を判定するために is.nan() という関数が用意されている.
is.na(NA) [1] TRUE is.nan(NA) [1] FALSE x <- c(1, NA, 3, 4) is.na(x) [1] FALSE TRUE FALSE FALSE |
引数に NA が含まれるとエラーになる関数がある.このような関数に NA が含まれるデータを渡す場合の対処法としては以下のようなものがある.
a <- c(1, 2, NA, 4, 5, NA) a[!is.na(a)] # a から NA を取り除いた [1] 1 2 4 5 a <- ifelse(is.na(a), 0, a) # NA を 0 に置き換える a [1] 1 2 0 4 5 0 |
NA を置き換えるのではなく,NA を要素に持つベクトルから,NA を読み飛ばして要素を読み取ることを考える.この場合は以下の様にすればよい.
x <- c(1, 2, NA, -4, 5, -6, 7, NA, 9, 10) y <- x[!is.na(x)] # NA 以外の x の要素を y に格納 y [1] 1 2 -4 5 -6 7 9 10 |
上を応用すれば,欠損値と負のデータを除去してデータを読み取ることも出来る.
x <- c(1, 2, NA, -4, 5, -6, 7, NA, 9, 10) y <- x[(!is.na(x)) & (x > 0)] # NA と負の値以外の x の要素を y # y に格納 [1] 1 2 5 7 9 10 |
NULL は属性を取り出す関数が属性値がないときの値として返すなど「適当な結果がない」ことを示すために使わる.NULL と欠損値 NA を混同してしまいがちだが,NA はベクトルの要素となり得るが,NULL はベクトルなのでそれ自身でベクトルの要素にはならない点が異なる.
length(NULL) # モード "NULL" を持つ長さが 0 のベクトルである [1] 0 a <- 1:3 names(a) # names 属性が付いていないので NULL が返る NULL |
上の手順を逆手にとって,属性値に NULL を代入して属性値を除去することができる.
names(a) <- c("a", "b", "c")
a
a b c
1 2 3
names(a) <- NULL
a
[1] 1 2 3
|
他に,繰り返し文で処理を行うオブジェクトの初期値にも NULL が使われたりする.
x <- NULL # 長さ 0 のベクトル x を用意 for (i in 1:10) x <- append(x, i*i) # x に i^2 を順に格納 x [1] 1 4 9 16 25 36 49 64 81 100 |
他に x <- c() や x <- numeric(0) などが使われる.また,as.character()
,as.numeric()
などの型変換関数を使って NULL をある型のベクトルに変換すると,指定された型の長さが
0 のベクトルになる.