992

このデータ フレームの次の行を削除したいと思います。

a)すべての列に sが含まれています。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)一部の列のみに s が含まれ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
4

18 に答える 18

1221

また、チェックしてください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すべてのを削除する方が良いですNAcomplete.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は非常に明確で、より高速です。

于 2011-02-01T12:21:42.927 に答える
299

試してみてくださいna.omit(your.data.frame)。2 番目の質問については、別の質問として投稿してみてください (わかりやすくするため)。

于 2011-02-01T12:00:44.690 に答える
185

tidyr新しい機能がありますdrop_na:

library(tidyr)
df %>% drop_na()
#              gene hsap mmul mmus rnor cfam
# 2 ENSG00000199674    0    2    2    2    2
# 6 ENSG00000221312    0    1    2    3    2
df %>% drop_na(rnor, cfam)
#              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
于 2016-08-16T08:49:23.513 に答える
97

行に NA が含まれているかどうかを確認するには、次の方法をお勧めします。

row.has.na <- apply(final, 1, function(x){any(is.na(x))})

これは、行に NA があるかどうかを示す値を持つ論理ベクトルを返します。これを使用して、削除する必要がある行数を確認できます。

sum(row.has.na)

そして最終的にそれらをドロップします

final.filtered <- final[!row.has.na,]

NA の特定の部分で行をフィルタリングする場合は、少し複雑になります (たとえば、'final[,5:6]' を 'apply' にフィードできます)。一般的に、Joris Meys のソリューションはより洗練されているようです。

于 2011-02-02T21:58:33.310 に答える
57

各行で有効な NA の数を制御したい場合は、この機能を試してください。多くの調査データ セットでは、空白の質問への回答が多すぎると、結果が台無しになる可能性があります。したがって、それらは特定のしきい値の後に削除されます。この関数を使用すると、行が削除される前に行が持つことができる NA の数を選択できます。

delete.na <- function(DF, n=0) {
  DF[rowSums(is.na(DF)) <= n,]
}

デフォルトでは、すべての NA が削除されます。

delete.na(final)
             gene hsap mmul mmus rnor cfam
2 ENSG00000199674    0    2    2    2    2
6 ENSG00000221312    0    1    2    3    2

または、許可される NA の最大数を指定します。

delete.na(final, 2)
             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
于 2015-05-26T14:49:39.607 に答える
48

行が無効であると見なされる方法をより細かく制御したい場合の別のオプションは、

final <- final[!(is.na(final$rnor)) | !(is.na(rawdata$cfam)),]

上記を使用すると、次のようになります。

             gene hsap mmul mmus rnor cfam
1 ENSG00000208234    0   NA   NA   NA   2
2 ENSG00000199674    0   2    2    2    2
3 ENSG00000221622    0   NA   NA   2   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
1 ENSG00000208234    0   NA   NA   NA   2
2 ENSG00000199674    0   2    2    2    2
3 ENSG00000221622    0   NA   NA   2   NA
4 ENSG00000207604    0   NA   NA   1    2
6 ENSG00000221312    0   1    2    3    2

rnor...両方のANDの NA を含む唯一の行であるため、行 5 のみが削除されcfamます。ブール論理は、特定の要件に合わせて変更できます。

于 2013-11-05T06:30:24.337 に答える
19

これにより、少なくとも 1 つの非 NA 値を持つ行が返されます。

final[rowSums(is.na(final))<length(final),]

これにより、少なくとも 2 つの非 NA 値を持つ行が返されます。

final[rowSums(is.na(final))<(length(final)-1),]
于 2014-09-19T12:36:18.440 に答える
14

これにはサブセット関数を使用することもできます。

finalData<-subset(data,!(is.na(data["mmul"]) | is.na(data["rnor"])))

これにより、mmul と rnor の両方で NA を持たない行のみが得られます。

于 2014-11-11T22:15:33.427 に答える