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?

pengguna3274289
sumber

Jawaban:

330

Anda terlalu memikirkan masalahnya:

sum(is.na(df$col))
rrs
sumber
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
Kevin Ogoro
sumber
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 
Tony Ladson
sumber
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))
bkielstr.dll
sumber
13

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

Shahin
sumber
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)
Abi K
sumber
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

hute37
sumber
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
Moohan
sumber
3

Coba ini:

length(df$col[is.na(df$col)])
Rabish kumar Singh
sumber
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

iec2011007
sumber
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
reza.cse08
sumber
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.

Chris Kiniry
sumber
2
sapply(name of the data, function(x) sum(is.na(x)))
UTKARSH
sumber
1
Lihat " Menjelaskan jawaban sepenuhnya berbasis kode ". Meskipun ini mungkin benar secara teknis, ini tidak menjelaskan mengapa ini menyelesaikan masalah atau harus menjadi jawaban yang dipilih. Kita harus mendidik selain membantu memecahkan masalah.
Tin Man
0

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

colSums(is.na(data_set_name)|data_set_name == '')
Prakhar Srivastava
sumber