Tentukan jumlah nilai NA dalam sebuah kolom


152

Saya ingin menghitung jumlah NAnilai dalam kolom bingkai data. Katakanlah bingkai data saya dipanggil df, dan nama kolom yang saya pertimbangkan adalah col. Cara saya menemukan adalah sebagai berikut:

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

Apakah ini cara yang baik / paling efisien untuk melakukan ini?

Jawaban:


330

Anda terlalu memikirkan masalahnya:

sum(is.na(df$col))

Terima kasih untuk ini. Untuk mengembangkan ini sedikit. Dalam menghitung jumlah sembarang value, selain NAmenulis fungsi boolean is.valuelalu menggunakan sum(is.value(df$col))cara to go atau ada sintaks langsung yang lebih ringkas untuk ini?
pengguna3274289

3
Terlalu cepat untuk bertanya. sum(df$col==value,na.rm=FALSE)berhasil.
pengguna3274289

4
@ user3274289: meskipun biasanya Anda ingin na.rm=TRUE, karena sebaliknya jika df$colberisi NAs, sumakan kembali NA.
jbaums

1
Kadang-kadang saya pikir saya terlalu banyak berpikir, sampai saya mendapatkan jawaban ini ... yah, itu benar ...
Rugal

maaf tapi ini tidak berhasil untuk saya. Saya mendapatkan peringatan ini Pesan peringatan: Dalam is.na (nom $ wd): is.na () diterapkan ke non- (daftar atau vektor) jenis 'NULL', dan hitungannya hanya nol.
Herman Toothrot

79

Jika Anda mencari NAjumlah untuk setiap kolom dalam kerangka data, maka:

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

harus memberi Anda daftar dengan jumlah untuk setiap kolom.

na_count <- data.frame(na_count)

Harus mengeluarkan data dengan baik dalam bingkai data seperti:

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

1
Untuk memasukkan nama baris sebagai kolom, jalankan juga na_count$name<-rownames(na_count).
Matt

7
na_count <-sapply(x, function(y) sum(is.na(y)))adalah alternatif yang lebih pendek.
Vincent Bonhomme

1
Tidak berhasil untuk saya :( Harus mengubahnya menjadi: na_count <- apply (x, function (y) sum (is.na (y)), MARGIN = 2)
Angel Garcia Campos

Saya tidak berpikir kita perlu menggunakan fungsi penjumlahan dan panjang (dalam tugas na_count pertama)? Panjangnya saja sudah cukup.
Yandle

44

Coba colSumsfungsinya

df <- data.frame(x = c(1,2,NA), y = rep(NA, 3))

colSums(is.na(df))

#x y 
#1 3 

1
Jika Anda berurusan dengan banyak kolom, Anda dapat mencapai hasil yang lebih baik dengan ´ colSums (is.na (df))%>% as.data.frame () ´ atau ´ as.data.frame (colSums (is.na ( df))) ´
BMLopes

19

Jika Anda ingin menghitung jumlah NA di seluruh kerangka data, Anda juga dapat menggunakan

sum(is.na(df))

13

Dalam summary()output, fungsi tersebut juga menghitung NAs sehingga seseorang dapat menggunakan fungsi ini jika menginginkan jumlah NAs dalam beberapa variabel.


2
Perlu dicatat bahwa summaryoutput saat digunakan pada satu kolom dapat digunakan, sedangkan outputnya dari seluruh bingkai data bersifat karakter dan jumlahnya sulit untuk diekstrak jika Anda membutuhkannya nanti. Lihat c(summary(mtcars)).
Rich Scriven

9

Cara terbalik untuk menghitung jumlah nol di setiap kolom bingkai data:

library(tidyverse)
library(purrr)

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

3
Anda bahkan tidak perlu purrr:df %>% summarise_all(funs(sum(is.na(.))))
David Bruce Borenstein

Jika Anda malas seperti saya, Anda dapat menulis hal yang sama dalam jawaban @Abi K dalam sintaks purrr yang agak lebih pendek sebagai: df %>% map_df(~sum(is.na(.)))atau tanpa dplyr sebagaimap_df(~sum(is.na(df)))
Agile Bean

7

Bentuk ini, sedikit berubah dari Kevin Ogoros:

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

mengembalikan jumlah NA sebagai array bernama int


untuk mendapatkan hasil sebagai daftar:na_count <-function (x) lapply(x, function(y) sum(is.na(y)))
hute37

7

Solusi Tidyverse yang cepat dan mudah untuk NAmenghitung semua kolom adalah dengan menggunakan summarise_all()yang menurut saya membuat solusi yang lebih mudah dibaca daripada menggunakan purrratausapply

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

Jawaban rrs pengguna benar tetapi itu hanya memberi tahu Anda jumlah nilai NA di kolom tertentu dari bingkai data yang Anda lewati untuk mendapatkan jumlah nilai NA untuk keseluruhan bingkai data coba ini:

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

Ini triknya


Ada beberapa kesalahan ketik yang membuat kode ini tidak berfungsi. Coba ini; apply(df, 2, function(x) sum(is.na(x)))
pengguna3495945

3

Saya membaca file csv dari direktori lokal. Kode berikut berfungsi untuk saya.

# 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

Mirip dengan jawaban hute37 tetapi menggunakan purrrpaket. Saya pikir pendekatan tidyverse ini lebih sederhana daripada jawaban yang diajukan oleh AbiK.

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

Catatan: tilde ( ~) membuat fungsi anonim. Dan '.' mengacu pada masukan untuk fungsi anonim, dalam hal ini data.frame df.



0

Anda dapat menggunakan ini untuk menghitung jumlah NA atau kosong di setiap kolom

colSums(is.na(data_set_name)|data_set_name == '')
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.