Xác định số lượng giá trị NA trong một cột


142

Tôi muốn đếm số lượng NAgiá trị trong một cột khung dữ liệu. Nói khung dữ liệu của tôi được gọi dfvà tên của cột tôi đang xem xét là col. Cách tôi đã đưa ra là như sau:

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

Đây có phải là một cách tốt / hiệu quả nhất để làm điều này?

Câu trả lời:


314

Bạn đang suy nghĩ quá mức vấn đề:

sum(is.na(df$col))

Cảm ơn vì điều này. Để mở rộng điều này một chút. Trong việc đếm số lượng tùy ý value, ngoài NAviệc viết một hàm boolean is.valuevà sau đó sử dụng sum(is.value(df$col))cách để đi hoặc có một cú pháp trực tiếp ngắn gọn hơn cho điều này?
dùng3274289

3
Đã quá nhanh để hỏi. sum(df$col==value,na.rm=FALSE)không lừa
dùng3274289

4
@ user3274289: mặc dù bạn thường muốn na.rm=TRUE, vì nếu không, nếu df$colchứa NA, sumsẽ quay lại NA.
jbaums

1
Đôi khi tôi nghĩ rằng tôi đã suy nghĩ quá mức, cho đến khi tôi nhận được câu trả lời này ... tốt, đó là sự thật ...
Rrif

xin lỗi nhưng điều này không làm việc cho tôi Tôi nhận được thông báo cảnh báo này: In is.na (nom $ wd): is.na () được áp dụng cho không (danh sách hoặc vectơ) loại 'NULL' và số đếm chỉ bằng không.
Herman Toothrot

77

Nếu bạn đang tìm kiếm NAsố lượng cho mỗi cột trong khung dữ liệu thì:

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

sẽ cung cấp cho bạn một danh sách với số lượng cho mỗi cột.

na_count <- data.frame(na_count)

Nên xuất dữ liệu độc đáo trong một khung dữ liệu như:

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

1
Để bao gồm các tên hàng như một cột, cũng chạy na_count$name<-rownames(na_count).
Matt

6
na_count <-sapply(x, function(y) sum(is.na(y)))là một sự thay thế ngắn hơn.
Vincent Bonhomme

1
Không làm việc cho tôi :( Phải đổi nó thành: na_count <- áp dụng (x, hàm (y) sum (is.na (y)), MARGIN = 2)
Angel Garcia Campos

Tôi không nghĩ rằng chúng ta cần sử dụng cả hàm tổng và hàm độ dài (trong phép gán na_count đầu tiên)? Chỉ cần chiều dài là đủ.
Yandle

39

Hãy thử colSumschức năng

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

colSums(is.na(df))

#x y 
#1 3 

18

Nếu bạn đang tìm cách đếm số lượng NA trong toàn bộ khung dữ liệu, bạn cũng có thể sử dụng

sum(is.na(df))

13

Trong summary()đầu ra, hàm cũng tính NAs để người ta có thể sử dụng hàm này nếu muốn tổng NAs trong một số biến.


2
Đáng lưu ý rằng summaryđầu ra khi được sử dụng trên một cột có thể sử dụng được, trong khi đầu ra của nó từ toàn bộ khung dữ liệu là ký tự và số lượng rất khó để trích xuất nếu bạn cần chúng sau này. Xem c(summary(mtcars)).
Rich Scriven

9

Một cách gọn gàng để đếm số lượng null trong mỗi cột của khung dữ liệu:

library(tidyverse)
library(purrr)

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

3
Bạn thậm chí không cần purrr:df %>% summarise_all(funs(sum(is.na(.))))
David Bruce Borenstein

Nếu bạn lười như tôi, bạn có thể viết tương tự trong câu trả lời của @Abi K theo cú pháp purrr ngắn hơn một chút như: df %>% map_df(~sum(is.na(.)))hoặc không có dplyr nhưmap_df(~sum(is.na(df)))
Agile Bean

7

Hình thức này, thay đổi một chút so với hình thức của Kevin Ogoros:

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

trả về NA được tính như là mảng int


để có kết quả như danh sách:na_count <-function (x) lapply(x, function(y) sum(is.na(y)))
hute37

6

Một giải pháp Tidyverse nhanh chóng và dễ dàng để có được NAsố đếm cho tất cả các cột là sử dụng summarise_all()mà tôi nghĩ làm cho giải pháp dễ đọc hơn nhiều so với sử dụng purrrhoặcsapply

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

Câu trả lời của người dùng là đúng nhưng điều đó chỉ cho bạn biết số lượng giá trị NA trong cột cụ thể của khung dữ liệu mà bạn đang truyền để lấy số lượng giá trị NA cho toàn bộ khung dữ liệu, hãy thử điều này:

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

Đây là mẹo


Có một số lỗi chính tả làm cho mã này không hoạt động. Thử cái này; apply(df, 2, function(x) sum(is.na(x)))
dùng3495945

3

Tôi đọc một tập tin csv từ thư mục địa phương. Mã sau làm việc cho tôi.

# 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

Tương tự như câu trả lời của hute37 nhưng sử dụng purrrgói. Tôi nghĩ cách tiếp cận gọn gàng này đơn giản hơn câu trả lời do AbiK đề xuất.

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

Lưu ý: dấu ngã ( ~) tạo một hàm ẩn danh. Và '.' đề cập đến đầu vào cho hàm ẩn danh, trong trường hợp này là data.frame df.


0

Bạn có thể sử dụng số này để đếm số NA hoặc khoảng trống trong mỗi cột

colSums(is.na(data_set_name)|data_set_name == '')

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

Xem " Giải thích câu trả lời hoàn toàn dựa trên mã ". Mặc dù điều này có thể đúng về mặt kỹ thuật nhưng nó không giải thích được tại sao nó giải quyết được vấn đề hoặc nên là câu trả lời được chọn. Chúng ta nên giáo dục ngoài việc giúp giải quyết vấn đề.
Tin Man
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.