确定列中NA值的数量


142

我想计算NA数据框列中的值数量。假设我的数据框被调用df,而我正在考虑的列的名称为col。我提出的方法如下:

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

这是一种很好/最有效的方法吗?

Answers:


314

您对问题的想法过多:

sum(is.na(df$col))

这次真是万分感谢。扩大一点。在计算任意量时value,除了NA编写布尔函数 is.value然后使用sum(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 2016年

抱歉,这对我不起作用。我收到此警告警告消息:在is.na(nom $ wd)中:is.na()应用于类型为“ NULL”的非(列表或向量),且计数仅为零。
Herman Toothrot

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

我认为我们不需要同时使用sum和length函数(在第一个na_count分配中)?仅仅长度就足够了。
Yandle

39

试用colSums功能

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

colSums(is.na(df))

#x y 
#1 3 

18

如果您要计算整个数据框中的NA数量,也可以使用

sum(is.na(df))

13

summary()输出中,该函数还会对NAs进行计数,因此如果一个人想要NA多个变量中s 的和,则可以使用此函数。


2
值得一提的是,在summary单列上使用时,输出是可用的,而在整个数据帧中的输出都是字符,如果以后需要它们,则很难提取计数。请参阅c(summary(mtcars))
Rich Scriven

9

一种用于计算数据帧每一列中的空值数量的方法:

library(tidyverse)
library(purrr)

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

3
您甚至都不需要purrr:df %>% summarise_all(funs(sum(is.na(.))))
David Bruce Borenstein,

如果您像我一样懒惰,则可以在@Abi K的答案中以较短的purrr语法编写相同的内容:df %>% map_df(~sum(is.na(.)))或不使用dplyr,如map_df(~sum(is.na(df)))
Agile Bean,

7

这种形式与Kevin Ogoros的形式略有不同:

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

以指定的int数组形式返回NA计数


得到结果作为列表:na_count <-function (x) lapply(x, function(y) sum(is.na(y)))
hute37 '16

6

一个快速简便的Tidyverse解决方案来获取NA所有列的计数是一种方法summarise_all(),我认为这比使用purrror 可以使解决方案更易于阅读。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 '16

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(.)))

注意:波浪号(~)创建一个匿名函数。还有“。” 引用匿名函数的输入,在本例中为data.frame df


0

您可以使用它来计算每列中的NA或空白数

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

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

请参阅“ 解释完全基于代码的答案 ”。尽管从技术上讲这可能是正确的,但并不能解释为什么它可以解决问题或应作为选择的答案。除了帮助解决问题,我们还应该进行教育。
锡人
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.