Определите количество значений NA в столбце


152

Я хочу подсчитать количество NAзначений в столбце фрейма данных. Скажем, мой фрейм данных вызван df, а имя рассматриваемого столбца - col. Я придумал следующее:

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

Это хороший / самый эффективный способ сделать это?

Ответы:


330

Вы слишком задумываетесь над проблемой:

sum(is.na(df$col))

Спасибо тебе за это. Чтобы немного расширить это. При подсчете произвольного количества value, кроме NAнаписания логической функции, is.valueа затем использования sum(is.value(df$col))пути, по которому идти, или для этого есть более сжатый прямой синтаксис?
user3274289 04

3
Слишком поспешил спросить. sum(df$col==value,na.rm=FALSE)делает свое дело.
user3274289 04

4
@ user3274289: хотя вы обычно хотите na.rm=TRUE, потому что в противном случае, если он df$colсодержит NA, sumвернется NA.
jbaums

1
Иногда мне кажется, что я слишком много думаю, пока не получил этот ответ ... ну, это правда ...
Ругал

извините, но это не работает для меня. Я получаю это предупреждение Предупреждение: In is.na (nom $ wd): is.na () применяется к не- (списку или вектору) типа 'NULL', и счетчик просто равен нулю.
Herman Toothrot

79

Если вы ищете 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).
Мэтт

7
na_count <-sapply(x, function(y) sum(is.na(y)))это более короткая альтернатива.
Винсент Бономм,

1
У меня не сработало :( Пришлось изменить его на: na_count <- apply (x, function (y) sum (is.na (y)), MARGIN = 2)
Angel Garcia Campos

Я не думаю, что нам нужно использовать и сумму, и функцию длины (в первом назначении na_count)? Просто длины должно хватить.
Yandle

44

Попробуйте colSumsфункцию

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

colSums(is.na(df))

#x y 
#1 3 

1
Если вы имеете дело с большим количеством столбцов, вы можете добиться лучшего результата с помощью ´ colSums (is.na (df))%>% as.data.frame () ´ или ´ as.data.frame (colSums (is.na ( df))) ´
BMLopes

19

Если вы хотите подсчитать количество NA во всем фрейме данных, вы также можете использовать

sum(is.na(df))

13

На summary()выходе функция также считает NAs, поэтому можно использовать эту функцию, если требуется сумма NAs в нескольких переменных.


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
Вам даже не нужно мурлыкать:df %>% summarise_all(funs(sum(is.na(.))))
Дэвид Брюс Боренштейн

Если вы такой же ленивый, как я, вы можете написать то же самое в ответе @Abi K в несколько более коротком синтаксисе мурлыканья как: df %>% map_df(~sum(is.na(.)))или без dplyr asmap_df(~sum(is.na(df)))
Agile Bean

7

Эта форма, немного измененная по сравнению с формой Кевина Огорос:

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

возвращает количество NA как именованный массив int


чтобы получить результат в виде списка:na_count <-function (x) lapply(x, function(y) sum(is.na(y)))
hute37 09

7

Быстрое и простое решение Tidyverse для NAподсчета всех столбцов - это использовать, summarise_all()что, как мне кажется, значительно упрощает чтение решения, чем использование purrrили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 07

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.


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

1
См. « Объяснение полностью основанных на коде ответов ». Хотя это может быть технически правильным, но не объясняет, почему он решает проблему или должен быть выбранным ответом. Мы должны обучать, чтобы помочь решить проблему.
Железный Человек

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.