ものすごい初歩的なことだったのに,調べてもなかなかヒットせずに格闘したのでメモ。
RでNAを処理する方法はたくさんあって,ある特定の列にNAが含まれる行だけ引っ張ってくるなどは結構簡単だったりする
subset(dat, is.na(dat$A))
とかでいい。ただし,データフレームにある複数の変数の中で1つでもNAが入っているかどうかとなるとちょっとどうしたらいいんだこれは,となる。
na.omit(dat)としてNAが含まれている行を全削除すればいいのでは?となるかもしれないが,実は今扱っているデータがlong型のうえにかなり複雑なデータフレームになっていて,同じidが複数行にまたがってしまっているという状態。実験のデザインがかなり複雑なのでこれはこれで仕方がない。
つまり,複数行のうち1行でもNAがあるidは,NAが含まれない行でも削除しないといけない。そのためには,NAが含まれる行のidを特定する必要があるわけだ。そこで,欠損値を含む行を抽出し,その中からid列だけを取ってくるという手続きを取る必要がでてきた。こうすれば,あとはdplyrのfilter関数なり,subset関数なりでそのidが含まれる行をすべて抜いて新しいデータセットを作ればよい。
それで,この,NA行の特定をベクトル形式で返してくれる関数が,complete.casesという関数。is.na関数にデータフレームを渡すと,その結果は行列(matrix)形式になる。これはこれで,どの行のどの列にNAがあるかを確かめるのにいいのだけれど,こちらが欲しいのは,「何行目」にNAが含まれるのかという情報だけ。そこで,complete.cases関数を以下のような感じで使う。
subset(dat, complete.cases(dat)==F)
あるいは,
dat%>%
filter(complete.cases(dat)==F)%>%
select(id)
上の方法だと,結果はデータフレームだけど,下の方法だとid列を引っ張ってくるところまでやるので,これをなにか別の変数(ここではmissIDにしてみる)にいれてあげて,
subset(dat,id != missID)
とかやれば,id列でmissIDに該当しない行だけを抽出してくれる。下書き状態で放置されていたからとりあえず最後まで書いたけど,自分がなんのデータに対してこの手続をしていたのかはもう思い出せないw
データ分析業務ばかりやってるのは楽しいからいいんですけどね。
なにをゆう たむらゆう。
おしまい。
※追記(2017.03.11)
subset(dat,id != missID)
とやってもうまくいかないことがあるようです,というか多分うまくいきません(自分でやってみてダメだったので)。多分ですが原因の1つはmissIDがデータフレーム形式になっている場合。ベクトルになおしてください。もう1つの原因は,subsetなりdplyrのfilterなりで複数の条件を設定する場合に,参照先がベクトル形式の場合には通常の論理演算記号が機能しないことです。多分こちらのほうが大問題。時間が経ってから書いたからかこのことをすっかり忘れていましたすみません。正しくは%in%を使って,
subset(dat, !id %in% missID)
とします。この場合,データフレームの中の参照先の列名の前に!をつけます。これをつけないと「当てはまるもの」を取り出すことになります。

ちょうど同じことをしたくてこのページにたどり着きました。ありがとうございます。
一点、欠損値を含まないデータセットを作る時は、2段回に分けずにそのまま
newdat %
filter(complete.cases(dat)==TRUE)
とするだけでできました。
ご指摘ありがとうございます。理解できているかわかりませんが,%の部分はパイプ演算ですか?
long型のデータだと複数行に同じIDのデータがあるので,欠損が1行あったときにそのIDの他の行も削除するというのはたぶん無理なんじゃないかと思ってこの記事を書いたのですが…
つまり
ID response
1 1
1 0
1 NA
1 1
…
みたいな感じになっていたとき,ID=1の人は欠損値があるので,このID1の人は1, 2, 3, 4行目すべて削除するという作業です。filter(complete.cases(dat)==TRUE)だけだと,上の例だと3行目だけ削除されて他の行は残るのではないかと思いますがそうではありませんか?