1. ホーム
  2. r

[解決済み] [Solved] data.frameで全てまたは一部のNA(欠損値)を含む行を削除する。

2022-03-23 13:38:50

質問

このデータフレームから、以下のような行を削除したい。

a) 含む NA を全列に渡って表示する。 以下は、私のデータフレームの例です。

             gene hsap mmul mmus rnor cfam
1 ENSG00000208234    0   NA   NA   NA   NA
2 ENSG00000199674    0   2    2    2    2
3 ENSG00000221622    0   NA   NA   NA   NA
4 ENSG00000207604    0   NA   NA   1    2
5 ENSG00000207431    0   NA   NA   NA   NA
6 ENSG00000221312    0   1    2    3    2

基本的には、以下のようなデータフレームを取得したいです。

             gene hsap mmul mmus rnor cfam
2 ENSG00000199674    0   2    2    2    2
6 ENSG00000221312    0   1    2    3    2

b) 含む NA 一部のカラムにのみ で、このような結果も得られます。

             gene hsap mmul mmus rnor cfam
2 ENSG00000199674    0   2    2    2    2
4 ENSG00000207604    0   NA   NA   1    2
6 ENSG00000221312    0   1    2    3    2

解決方法は?

こちらもご覧ください complete.cases :

> final[complete.cases(final), ]
             gene hsap mmul mmus rnor cfam
2 ENSG00000199674    0    2    2    2    2
6 ENSG00000221312    0    1    2    3    2

na.omit をすべて削除するには、より良い方法です。 NA 's. complete.cases は、データフレームの特定の列のみを含むことで、部分的な選択を可能にします。

> final[complete.cases(final[ , 5:6]),]
             gene hsap mmul mmus rnor cfam
2 ENSG00000199674    0    2    2    2    2
4 ENSG00000207604    0   NA   NA    1    2
6 ENSG00000221312    0    1    2    3    2

あなたの解決策はうまくいくはずがありません。もしあなたが is.na というようなことをしなければならない。

> final[rowSums(is.na(final[ , 5:6])) == 0, ]
             gene hsap mmul mmus rnor cfam
2 ENSG00000199674    0    2    2    2    2
4 ENSG00000207604    0   NA   NA    1    2
6 ENSG00000221312    0    1    2    3    2

を使用していますが complete.cases の方がはるかにわかりやすいし、スピードも速い。