Rの非数値の取り扱い方,NULL,NA,NaN,Infの除外と置換

欠損値

欠損値・非数値の判定

データ中の欠損値は NA と表される。この他、非数値 NaN、無限大 Inf などがある。データに非数値が含まれると、計算が正しく行われない場合がある。これらを調べるとき、以下のような関数を用いる。

関数判断する条件
is.null未定義 NULL かどうか
is.na欠損値 NA かどうか
is.nan非数 NaN かどうか
is.finite有限かどうか
is.infinite無限 Inf かどうか
x <- c(1, log(0), 0/0, NA)
x
## [1]    1 -Inf  NaN   NA

is.na(x)
## [1] FALSE FALSE  TRUE  TRUE 

is.nan(x)
## [1] FALSE FALSE  TRUE FALSE

is.finite(x)
## [1]  TRUE FALSE FALSE FALSE

is.infinite(x)
## [1] FALSE  TRUE FALSE FALSE

欠損値・非数値の除去 na.rm オプション

データに欠損値が含まれるとき、合計値の計算やそのグラフを描くとき、エラーが起こる場合がある。そのため、一部の関数には欠損値を無視するオプション na.rm が用意されている。

x <- c(1, 2, 3, 4, NA, NaN)

# 欠損値を無視しない
sum(x)
## [1] NA

# 欠損値を無視する
sum(x, na.rm = TRUE)
## [1] 10

na.rm が指定できない関数は、次のように除去する。

x <- c(1, 2, 3, 4, NA, NaN)
sum(x)
## [1] NA

y <- x[!is.na(x)]
y
## [1] 1 2 3 4

sum(y)
## [1] 10

欠損値・非数値の除去

欠損値や非数値の取り除き方として、ifelse 文、replace 文、which 文やベクトル演算などの方法がある。速度を重視するなら、なるべくベクトル演算を利用する。

次は、NANaN を 0 に置換する例である。

x <- c(1, 2, 3, 4, NA, NaN)

ifelse(is.na(x), 0, x)
## [1] 1 2 3 4 0 0

replace(x, which(is.na(x)), 0)
## [1] 1 2 3 4 0 0

x[is.na(x)] <- 0
x
## [1] 1 2 3 4 0 0

x[which(is.na(x))] <- 0
x
## [1] 1 2 3 4 0 0

マイナス無限大を 0 に置換する例です。

x <- c(-Inf, 1, 2, 3, 4, Inf)

ifelse((is.infinite(x) & (x < 0)) , 0, x)
## [1]   0   1   2   3   4 Inf

replace(x, which(is.infinite(x) & (x < 0)), 0)
## [1]   0   1   2   3   4 Inf

x[is.infinite(x) & (x < 0)] <- 0
x
## [1]   0   1   2   3   4 Inf

データフレーム

データフレームに関しては、上記の方法とは別に na.omit 関数を用いる方法もある。

df <- data.frame(a = c(1, 1, 1, 1), b = c(1, NA, 1, 1), c = c(1, 2, 3, Inf))
head(df)
##   a  b   c
## 1 1  1   1
## 2 1 NA   2
## 3 1  1   3
## 4 1  1 Inf


# 欠損値を除去します
na.omit(df)
##   a b   c
## 1 1 1   1
## 3 1 1   3
## 4 1 1 Inf