欠損値

欠損値はNA (not available) で表現される。不可能値 (impossible value , e.g., 0を分母にして割ったり) はNaN (not a number) 。文字変数でも数値変数でも同じ。

欠損値があるかどうかを調べる

x <- c(1,2,3,NA) # データフレームでも可
is.na(x) # 欠損値のある要素にはTRUE, ない要素にはFALSE。入ったベクトルならベクトル、データフレームならデータフレームを返す。 sum(is.na(x)) # 欠損値の数の総計

欠損値の再コード化 (入力データの置換)

# 99と入力してある欠損値をNAに置き換える。
# サンプル
  x <- data.frame(matrix(c(rnorm(5), 99, 99, rnorm(13)), nr=10))
  names(x) <- c("v1", "v2")
  x
# 置換 (変数ごとに指定)
x[x$v1==99, "v1"] <- NA
x

# 一括で置換 (変数ごとに指定しない)
x[x==99] <- NA
x

欠損値の除去

欠損値を除去した関数の適用

x <- c(1,2,NA,3)
mean(x)          # returns NA
mean(x, na.rm=TRUE) # returns 2

complete.cases() 関数は行ごとにNAがあるならFALSE、ないならTRUEをかどうかのTRUE/FALSEをベクトルで返す。

complete.cases(x)
!complete.cases(x) # T/Fの逆転。欠損値があるとT、ないとF

# 欠損データのある行だけを抜き出す。
x[!complete.cases(x),]

na.omit() 欠損値のあるケースをまるごと除いた (リストワイズ除去した) オブジェクトを返す.

na.omit(x)

高度な欠損値処理

多重補完法 (multiple imputation) などの高度な欠損値処理にはAmelia IIMicemitools なんかを使おう。


その他

# サンプル
dat <- iris
# 特定の値を欠損値とする
dat[dat=="setosa"] <- NA
dat[dat==9999] <- NA # 数値もできる

# データフレームの変数ごとに欠損値があるかどうか
sapply(dat, function(x) sum(is.na(x)))

# 変数を指定して欠損値とする。データ内に既に欠損値があるとエラーになる
dat[dat$Species=="virginica", "Species"] <- NA

# 欠損値の除去
# 関数内では大体na.rm=Tとする
mean(x, na.rm=T)

# データフレームから行 (ケース) ごと除去
na.omit(dat)

Amelia II, Mice, mitools といったパッケージがあるらしい

# おまけ。特定の値を欠損値とする...のがわからなかったときに書いた
dat2 <- iris
for(i in 1:ncol(dat)){
dat2[,i] <- replace(dat[,i], which(dat[,i]=="setosa"), NA)
}