欠損値・非数値の判定
データ中の欠損値は 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
文やベクトル演算などの方法がある。速度を重視するなら、なるべくベクトル演算を利用する。
次は、NA
や NaN
を 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