data.frame内の全部または一部のNA(欠損値)を含む行を削除する。
このデータフレームで、以下のような行を削除したいのです:
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
785
16
また、
complete.cases
もご確認ください:na.omit
は、すべての
NA's を削除するのに適しています。complete.cases
は、データフレームの特定のカラムのみを含むことで部分選択を可能にする:あなたの解決策はうまくいきません。もし、どうしても
is.na
を使いたいのであれば、次のようなことをしなければなりません:が、
complete.cases
を使ったほうが、かなりわかりやすく、スピードも速いです。na.omit(your.data.frame)`を試してみてください。2つ目の質問については、別の質問として投稿してみてください(わかりやすくするため)。
tidyr
には新しい関数[drop_na
]があります(https://blog.rstudio.org/2016/08/15/tidyr-0-6-0/):行にNAが含まれているかどうかをチェックする方法は、次のようなものがあります:
行が無効であると見なされる方法をより詳細に制御したい場合は、別のオプションがあります。
各行に有効なNAの数を制御する場合は、この機能を試してください。 多くの調査データセットでは、空白の質問の回答が多すぎると結果が台無しになる可能性があります。 したがって、特定のしきい値の後に削除されます。 この関数を使用すると、行が削除される前に実行できるNAの数を選択できます。
パフォーマンスが優先される場合は、オプションのparam
cols =
を使用して、data.table
およびna.omit()
を使用します。na.omit.data.table
は最速です私のベンチマーク(以下を参照)、すべての列または選択した列(OP質問パート2)。data.table
を使用しない場合は、complete.cases()
を使用します。バニラ
data.frame
では、complete.cases
は[na .omit()
](https:/www.rdocumentation.org/packages/3.4.na.omit.data.frame
はcols =
をサポートしていないことに注意してください。ベンチマーク結果。
以下は、20の数値変数の100万の観測値と独立した5の観測値の想定データセットで、すべてまたは欠落観測値を選択するためのベース(青)、
dplyr
(ピンク)、およびdata.table
(黄色)メソッドの比較です。欠落する可能性の割合、およびパート2の4つの変数のサブセット。結果は、特定のデータセットの長さ、幅、およびスパーシティに基づいて異なる場合があります。
y軸のログスケールに注意してください。
[。![ここに画像の説明を入力してください][1]][1]。
ベンチマークスクリプト。
dplyrパッケージを使用すると、NAを次のようにフィルタリングできます。
これにより、少なくとも1つの非NA値を持つ行が返されます。
最初の質問については、すべてのNAを取り除くために快適なコードがあります。 @Gregorをシンプルにしてくれてありがとう。
2番目の質問では、コードは以前のソリューションからの単なる代替です。
-5はデータの列数であることに注意してください。 rowSumsの合計が5になり、減算後にゼロになるため、これによりすべてのNAを持つ行が排除されます。 今回は、as.logicalが必要です。
これにはサブセット関数を使用することもできます。
私はシンセサイザーです:)。 ここで、回答を1つの関数に結合しました。
データフレームとして「dat」を想定すると、期待出力はを使用して達成できます。
1。
rowSums
。2。
幸せ
。一般的でかなり読みやすいコードを生成する1つのアプローチは、dplyrパッケージで「filter」関数とそのバリアントを使用することです(「filter_all」、「filter_at」、「filter_if」)。
これは、この方法でよりエレガントに解決できると思います。