データフレームの選択された列にNA(欠損)値を含む行のサブセット


96

CSVファイルからのデータフレームがあります。データフレームにDFは、観測値を含む列VaR2と、測定が行われた日付を含む列()があります。日付が記録されなかった場合、CSVファイルにはNA欠落データの値が含まれます。

Var1  Var2 
10   2010/01/01
20   NA
30   2010/03/01

サブセットコマンドを使用して、列からの値new_DFを持つ行のみが含まれるように新しいデータフレームを定義したいと思いNA'ます(VaR2)。上記の例では、行2のみが新しいに含まれDFます。

コマンド

new_DF<-subset(DF,DF$Var2=="NA") 

機能しません。結果のデータフレームには行エントリがありません。

元のCSVファイルで値NAがと交換された NULL場合、同じコマンドで目的の結果が生成されますnew_DF<-subset(DF,DF$Var2=="NULL")

文字列の値NAが元のCSVファイルで提供されている場合、このメソッドをどのように機能させることができますか?

回答:


145

欠落値のテストに== 'NA'を使用しないでください。is.na()代わりに使用してください。これはそれを行うはずです:

new_DF <- DF[rowSums(is.na(DF)) > 0,]

または、特定の列を確認したい場合は、

new_DF <- DF[is.na(DF$Var),]

NA文字値がある場合は、最初に実行します

Df[Df=='NA'] <- NA

それらを欠損値で置き換える。


2
素早い回答ありがとうございます(これは迅速でした)。実際、データのcsv配信のため、「NA」は文字値であり、2番目のステートメントは非常に役立つ場合があります。また、最初のステートメントを明確にできますか?rowSums()の使用は明確ではありません。特定の列のみをチェックするためです(多くの列があります)。その特定の列(例では列Var2)に 'NA'文字列がある場合(2番目のステートメントで置き換えます)、行全体を新しいデータフレームの一部として選択します。 。
ジョン

@ジョン:更新。is.naを使用するのがポイントですが、すべての変数をチェックする必要があると誤って解釈しました。
Joris Meys

3
それはする必要がありますnew_DF <- DF[is.na(DF$Var),]余分があるように見える、すなわち(後ブラケットDF[
PatrickT 2013

39

NAはRの特別な値です。NA値を「NA」文字列と混同しないでください。データのインポート方法によっては、「NA」と「NULL」のセルのタイプが異なる場合があります(デフォルトの動作では、「NA」文字列をNA値に変換し、「NULL」文字列をそのままにします)。

read.table()またはread.csv()を使用する場合は、「na.strings」引数を考慮してクリーンなデータインポートを実行し、常に実際のR NA値を処理する必要があります。

例、 "NULL"と "NA"の両方のセルで機能する例:

DF <- read.csv("file.csv", na.strings=c("NA", "NULL"))
new_DF <- subset(DF, is.na(DF$Var2))

1
ご回答有難うございます。私がそれを正しく理解していれば、最初のステートメントは、Jorisの例のDf [Df == 'NA'] <-NAと同じようになりますか?(小さな)違いは、データフレームが作成されたときに、最初にステートメントで直接行われることです(これは非常にクリーンなプログラミング方法なので、私は気に入っています)。
ジョン

丁度。Jorisは、「NA」文字列を手動でNA値に置き換えることを提案しました。ここでは、同じ目的を達成するためにread.table()の「na.strings」機能を使用することのみをお勧めします。
maressyl

Jorisの答えは、実際にこの偉業を達成するための「推奨される」方法です(これをスクリプトで記述している場合)。参照:stackoverflow.com/questions/9860090/...
ジョナサン・

@ジョナサン:ここで2つの異なるアイデア、引用したトピックは「[」は「サブセット」よりも優先されるはずだと述べていますが、read.table()の「na.strings」引数について話していました。私のサブセットは視覚化するためだけにありました効果。
maressyl 2013

32

complete.casesTRUE行のすべての値がそうでない場合に与えるNA

DF[!complete.cases(DF), ]

11
new_data <- data %>% filter_all(any_vars(is.na(.))) 

これによりnew_data、欠損値のみを含む新しいデータフレーム()が作成されます。

観測値(NA)が欠落している列がいくつかあったために後で削除する可能性がある値を追跡するのに最適です。


3

これを変更してみてください:

new_DF<-dplyr::filter(DF,is.na(Var2)) 

なぜこれが機能するのか、何ができるのかなどを説明できますか?
csilk

new_DF <-dplyr ::フィルタ(DF、is.na(VAR2))それは基本的に、彼らはNAとすべての観測を選ぶすなわちis.na条件を満たしVAR2列内の任意の観測からdplyrパッケージとフィルタのフィルタ機能を使用します
drhnis

1
よりうまく表現されたDF %>% filter(is.na(Var2))library(dplyr)
ジョー

-1

NAデータを含むすべての行を出力します。

tmp <- data.frame(c(1,2,3),c(4,NA,5));
tmp[round(which(is.na(tmp))/ncol(tmp)),]

@ZheyuanLi答えが気に入らない場合は、単に反対票を投じてください。フラグ付けを推奨する回答を編集することは、適切なアクションではありません。必要に応じてコメントを残してください。
Manfred Radlwimmer、2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.