欠損値
欠損値は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 II、Mice、mitools なんかを使おう。
その他
# サンプル
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)
}