列のNA値の数を決定する


142

NAデータフレーム列の値の数を数えたい。私のデータフレームが呼び出されdf、検討している列の名前がそうだとしますcol。私が思いついた方法は次のとおりです:

sapply(df$col, function(x) sum(length(which(is.na(x)))))  

これはこれを行うための良い/最も効率的な方法ですか?

回答:


314

あなたは問題を考えすぎています:

sum(is.na(df$col))

これありがとう。これを少し拡大します。ブール関数を書いて、次に進む方法を使用するvalue以外NAは 、恣意的な量を数えるのに、もっと簡潔な直接構文がありますか?is.valuesum(is.value(df$col))
user3274289 2014年

3
質問するには速すぎました。sum(df$col==value,na.rm=FALSE)トリックを行います。
user3274289 2014年

4
@ user3274289:通常は必要ですがna.rm=TRUE、それ以外の場合df$colはNAが含まれているため、sumが返されNAます。
jbaums 2014年

1
時々私はこの答えを得るまで、私は考えすぎだと思います...まあ、それは本当です...
Rugal

申し訳ありませんが、これは私にはうまくいきません。この警告が表示されます警告メッセージ:is.na(nom $ wd):is.na()がタイプ 'NULL'の非(リストまたはベクトル)に適用され、カウントはゼロです。
Herman Toothrot 2016年

77

NAデータフレームの各列のカウントを探している場合:

na_count <-sapply(x, function(y) sum(length(which(is.na(y)))))

各列のカウントのリストが表示されます。

na_count <- data.frame(na_count)

次のようなデータフレームでデータを適切に出力する必要があります:

----------------------
| row.names | na_count
------------------------
| column_1  | count

1
行名を列として含めるには、も実行しna_count$name<-rownames(na_count)ます。
マット

6
na_count <-sapply(x, function(y) sum(is.na(y)))短い代替です。
Vincent Bonhomme 2016年

1
私にはうまくいきませんでした:(これを次のように変更する必要がありました:na_count <-apply(x、function(y)sum(is.na(y))、MARGIN = 2)
Angel Garcia Campos

(最初のna_count割り当てで)sum関数とlength関数の両方を使用する必要はないと思いますか?長さだけで十分です。
Yandle


18

データフレーム全体のNAの数を数える場合は、次の方法も使用できます。

sum(is.na(df))

13

ではsummary()出力、機能もカウントNA1が和たい場合は、1つは、この機能を使用できるようにSをNA複数の変数で秒。


2
summary単一の列で使用した場合の出力は使用可能ですが、データフレーム全体からの出力は文字であり、後で必要になった場合にカウントを抽出することは困難です。を参照してくださいc(summary(mtcars))
Rich Scriven

9

データフレームのすべての列のnullの数をカウントするための整然とした方法:

library(tidyverse)
library(purrr)

df %>%
    map_df(function(x) sum(is.na(x))) %>%
    gather(feature, num_nulls) %>%
    print(n = 100)

3
さえしゃべる必要はありません:df %>% summarise_all(funs(sum(is.na(.))))
デビッドブルースBorenstein

私のように怠惰な場合は、@ Abi Kの回答に同じように、やや短いpurrr構文で次のように記述できます。df %>% map_df(~sum(is.na(.)))または、dplyr asなしmap_df(~sum(is.na(df)))
Agile Bean

7

このフォームは、Kevin Ogorosのフォームからわずかに変更されました。

na_count <-function (x) sapply(x, function(y) sum(is.na(y)))

名前付き整数配列としてNAカウントを返します


結果をリストとして取得するには:na_count <-function (x) lapply(x, function(y) sum(is.na(y)))
hute37

6

取得するために迅速かつ簡単なTidyverseソリューションNAすべての列の数が使用されsummarise_all()、私が使用するよりも解決読み取ることがはるかに容易になりますだと思うpurrrかをsapply

library(tidyverse)
# Example data
df <- tibble(col1 = c(1, 2, 3, NA), 
             col2 = c(NA, NA, "a", "b"))

df %>% summarise_all(~ sum(is.na(.)))
#> # A tibble: 1 x 2
#>    col1  col2
#>   <int> <int>
#> 1     1     2


3

ユーザーrrsの答えは正しいですが、データフレーム全体のNA値の数を取得するために渡すデータフレームの特定の列にあるNA値の数のみを通知します。

apply(<name of dataFrame>, 2<for getting column stats>, function(x) {sum(is.na(x))})

これはトリックです


このコードが機能しないようにするいくつかのタイプミスがあります。これを試して; apply(df, 2, function(x) sum(is.na(x)))
user3495945 2016年

3

ローカルディレクトリからcsvファイルを読み取りました。次のコードは私のために働きます。

# to get number of which contains na
sum(is.na(df[, c(columnName)]) # to get number of na row

# to get number of which not contains na
sum(!is.na(df[, c(columnName)]) 

#here columnName is your desire column name

2

hute37の回答に似ていますが、purrrパッケージを使用しています。この整然としたアプローチは、AbiKが提案する答えよりも簡単だと思います。

library(purrr)
map_dbl(df, ~sum(is.na(.)))

注:チルド(~)は無名関数を作成します。そしてその '。' 無名関数の入力を参照しdfます。この場合はdata.frame です。



0
sapply(name of the data, function(x) sum(is.na(x)))

完全にコードベースの回答の説明参照してください。これは技術的には正しいかもしれませんが、問題を解決する理由や、選択された答えである必要がある理由は説明していません。問題の解決に役立つように、さらに教育する必要があります。
ティンマン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.