data.frameで欠落している値を報告するエレガントな方法


80

これは、データフレームから値が欠落している変数をレポートするために作成した小さなコードです。私はこれを行うためのよりエレガントな方法を考えようとしています。おそらくdata.frameを返す方法ですが、行き詰まっています。

for (Var in names(airquality)) {
    missing <- sum(is.na(airquality[,Var]))
    if (missing > 0) {
        print(c(Var,missing))
    }
}

編集:私は数十から数百の変数を持つdata.framesを扱っているので、欠落している値を持つ変数のみを報告することが重要です。


@kohske:それが私の最初の考えでしたが、結果はtable文字の結果であり、NAの数を解析する必要があります。
Joshua Ulrich

あなたが回答を投稿したので、私はあなたの質問を元に戻します。回答にコメントしたい場合は、その回答へのコメントとして行ってください。質問に回答も含まれている場合、これは非常に混乱します。
アンドリー2011年

@Andrie:私が直面している重要な問題は、値が欠落している変数のみを報告することであるため、あなたの編集に同意しません。さらに、ロールバックにより、コードに加えた変更が削除されました。この情報を含めるように質問を編集し、Joshのコードの修正バージョンをコメントに追加しました。
ザック

@Zachあなたの新しい編集は私にはうまく見えます。ちなみに、質問が明確になれば、ライブになったら質問にデータやリクエストを追加することを嫌がりません。
アンドリー2011年

これを行うには半分百万の方法が参照ありますMissingDataは- CRANタスクビューを
zx8754

回答:


156

使用するだけ sapply

> sapply(airquality, function(x) sum(is.na(x)))
  Ozone Solar.R    Wind    Temp   Month     Day 
     37       7       0       0       0       0

によって作成されたマトリックスでapplyまたはcolSumsを使用することもできますis.na()

> apply(is.na(airquality),2,sum)
  Ozone Solar.R    Wind    Temp   Month     Day 
     37       7       0       0       0       0
> colSums(is.na(airquality))
  Ozone Solar.R    Wind    Temp   Month     Day 
     37       7       0       0       0       0 

12
私は不足している値を報告するために、少し自分のコードを修正:M <- sapply(airquality, function(x) sum(is.na(x))); M[M>0]
ザック

ありがとう!多くを学んだ。
Bombyx mori

こんにちは@JoshuaUlrich、簡潔なコードをありがとうございます。na値のパーセンテージを示す列をデータフレームに追加したいと思います。これに関して助けていただけますか?
DukeLover 2017年

2
@Zach私は必要なフィールドに値を持っていることを確認するためにあなたの提案のバージョンを使用:M <- colSums(is.na(airquality)); M[M <= 0]
アンソニー・サイモンMielniczuk

@Joshuaが%sのオプションを追加するのもエースです!
ラデク

8

map_dfpurrrで使用できます。

library(mice)
library(purrr)

# map_df with purrr
map_df(airquality, function(x) sum(is.na(x)))
# A tibble: 1 × 6
# Ozone Solar.R  Wind  Temp Month   Day
# <int>   <int> <int> <int> <int> <int>
# 1    37       7     0     0     0     0

1
上の利点はmap_dfsapplyですか?
ザック

1
@Zach大きな違いはないと思いますが、Hadleyは関数内でsapply()を使用しないように言っています。例外とデバッグを参照してください。・Advanced R.adv-r.had.co.nz/Exceptions-Debugging.html
Keiku 2017年

:それは次のようになりますので、私のように怠惰な人々のために、あなたは、関数(〜)のために短いpurrr構文で上記のコードを書くことができますmap_df( air quality, ~sum(is.na(.) )
アジャイルビーン

1
利点@Zachmap_df以上がsapplymap_dfの出力形式は常にtibbleであるように、結果は多くの行がある場合にのみです。
アジャイルビーン

1
@Zach :(指定した)既知の結果構造が得られるため、関数でvapplyvsを使用sapplyすることvapplyをお勧めします。sapply関数の出力に応じて、配列またはリストを返す場合があります。の欠点はmap_df、入力としてdata.frameを指定すると、data.frameではなくdata.frameサブクラスが返されることです。将来、必要なすべての場合に、tibblesがdata.framesのように動作するという保証はありません。
ジョシュア・ウルリッヒ

8

(広すぎない)データの私の新しいお気に入りは、優れたnaniarパッケージのメソッドです。頻度だけでなく、欠落のパターンも取得します。

library(naniar)
library(UpSetR)

riskfactors %>%
  as_shadow_upset() %>%
  upset()

ここに画像の説明を入力してください

欠落のある散布図をプロットすることで達成できる、欠落がないこととの関係で欠落がどこにあるかを確認すると便利なことがよくあります。

ggplot(airquality,
       aes(x = Ozone,
           y = Solar.R)) +
 geom_miss_point()

ここに画像の説明を入力してください

または、カテゴリ変数の場合:

gg_miss_fct(x = riskfactors, fct = marital)

ここに画像の説明を入力してください

これらの例は、他の興味深い視覚化をリストしたパッケージビネットからのものです。


2
これを投稿してくれてありがとう!gg_miss_upset()最新のリリースには専用の機能があり、休日から戻ったらCRANに送信されます。naniar.njtierney.com/reference/gg_miss_upset.html
Nick Tierney

6
summary(airquality)

すでにこの情報を提供しています

VIMのパッケージもdata.frameのためのいくつかの素晴らしい欠落したデータプロットを提供しています

library("VIM")
aggr(airquality)

ここに画像の説明を入力してください


VIMパッケージは、どの特定の観測に欠測データがあるかを報告できますか?
Anthony Simon Mielniczuk 2016年

そうは思わない..しかし、これは非常に簡単に行うことができます(空気品質を独自のデータフレームに置き換える必要があります):res <-airquality [rowSums(is.na(airquality))> 0、]
Steffen Moritz

4

より簡潔-: sum(is.na(x[1]))

あれは

  1. x[1] 最初の列を見てください

  2. is.na() それが本当なら本当 NA

  3. sum() TRUEです1FALSEです0


これは、データ内のすべてのNAのsの数を見つけるという元の質問には答えません
Ben Bolker 2015

4

別のグラフィカルな代替手段-plot_missing優れたDataExplorerパッケージの関数:

ここに画像の説明を入力してください

ドキュメントは、この結果を保存して追加の分析を行うことができるという事実も指摘していますmissing_data <- plot_missing(data)


パッケージplot_missing()内の関数DataExplorerはになりましたPlotMissing()
coip 2018年

1
@coipPlotMissing()は非推奨です。plot_missing()代わりに使用してください。詳細については、#49を参照してください。
Boxuan 2018

2

不足しているデータを確認するのに役立つもう1つの関数は、funModelingライブラリのdf_statusです。

library(funModeling)

iris.2は、いくつかのNAが追加されたアイリスデータセットです。これをデータセットに置き換えることができます。

df_status(iris.2)

これにより、各列のNAの数と割合がわかります。


1

もう1つのグラフィカルなソリューションとして、visdat パッケージはを提供しますvis_miss

library(visdat)
vis_miss(airquality)

ここに画像の説明を入力してください

Amelia出力と非常によく似ていますが、箱から出して不足しているものに%sを与えるというわずかな違いがあります。


1

Ameliaライブラリは、欠落データの処理に優れていると思います。欠落した行を視覚化するためのマップも含まれています。

install.packages("Amelia")
library(Amelia)
missmap(airquality)

ここに画像の説明を入力してください

次のコードを実行して、naの論理値を返すこともできます。

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

1

もう1つのグラフィカルでインタラクティブな方法はis.na10heatmaplyライブラリの関数を使用することです。

library(heatmaply)

heatmaply(is.na10(airquality), grid_gap = 1, 
          showticklabels = c(T,F),
            k_col =3, k_row = 3,
            margins = c(55, 30), 
            colors = c("grey80", "grey20"))

ここに画像の説明を入力してください

おそらく、大きなデータセットではうまく機能しません。


0

特定の列に対してそれを実行したい場合は、これを使用することもできます

length(which(is.na(airquality[1])==T))

4
論理ベクトルをTと比較する必要はありません。論理ベクトルを合計することにより、論理ベクトル内のTRUE要素の数を数えることもできます。
Houshalter 2014


0

dplyrカウントを取得するためのソリューションは次のようになります。

summarise_all(df, ~sum(is.na(.)))

またはパーセンテージを取得するには:

summarise_all(df, ~(sum(is_missing(.) / nrow(df))))

また、欠落しているデータは醜く、一貫性がなくNA、ソースやインポート時の処理方法に応じてコード化されるとは限らないことにも注意してください。次の関数は、データと不足していると見なしたいものに応じて微調整できます。

is_missing <- function(x){
  missing_strs <- c('', 'null', 'na', 'nan', 'inf', '-inf', '-9', 'unknown', 'missing')
  ifelse((is.na(x) | is.nan(x) | is.infinite(x)), TRUE,
         ifelse(trimws(tolower(x)) %in% missing_strs, TRUE, FALSE))
}

# sample ugly data
df <- data.frame(a = c(NA, '1', '  ', 'missing'),
                 b = c(0, 2, NaN, 4),
                 c = c('NA', 'b', '-9', 'null'),
                 d = 1:4,
                 e = c(1, Inf, -Inf, 0))

# counts:
> summarise_all(df, ~sum(is_missing(.)))
  a b c d e
1 3 1 3 0 2

# percentage:
> summarise_all(df, ~(sum(is_missing(.) / nrow(df))))
     a    b    c d   e
1 0.75 0.25 0.75 0 0.5
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.