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

152

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

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

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

user3274289
источник

Ответы:

330

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

sum(is.na(df$col))
rrs
источник
Спасибо тебе за это. Чтобы немного расширить это. При подсчете произвольного количества 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))
bkielstr
источник
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)
Abi K
источник
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

дом37
источник
чтобы получить результат в виде списка: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

Попробуй это:

length(df$col[is.na(df$col)])
Рабиш Кумар Сингх
источник
3

Ответ пользователя rrs правильный, но он сообщает вам только количество значений NA в конкретном столбце фрейма данных, который вы передаете, чтобы получить количество значений NA для всего фрейма данных, попробуйте следующее:

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

Это трюк

iec2011007
источник
Есть несколько опечаток, которые делают этот код нефункциональным. Попробуй это; 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
reza.cse08
источник
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
См. « Объяснение полностью основанных на коде ответов ». Хотя это может быть технически правильным, но не объясняет, почему он решает проблему или должен быть выбранным ответом. Мы должны обучать, чтобы помочь решить проблему.
Железный Человек
0

Вы можете использовать это для подсчета количества NA или пробелов в каждом столбце

colSums(is.na(data_set_name)|data_set_name == '')
Пракхар Шривастава
источник