Визначте кількість значень NA у стовпчику


142

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

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

Це хороший / найефективніший спосіб зробити це?

Відповіді:


316

Ви надмірно думаєте про проблему:

sum(is.na(df$col))

Дякую за це. Щоб трохи розширити це. Підраховуючи довільну кількість value, крім NAнаписання булевої функції is.valueта використання sum(is.value(df$col))способу проходження, чи є для цього більш стислий прямий синтаксис?
користувач3274289

3
Занадто швидко просив. sum(df$col==value,na.rm=FALSE)робить трюк.
користувач3274289

4
@ user3274289: хоча ви зазвичай хочете na.rm=TRUE, бо в іншому випадку, якщо вони df$colмістять NA, sumповернеться NA.
jbaums

1
Іноді я думаю, що я переосмислюю, поки не отримав цю відповідь ... ну це правда ...
Rugal

вибачте, але це не працює для мене. Я отримую це попередження Попереджувальне повідомлення: У is.na (nom $ wd): is.na () застосовується до не- (списку чи вектору) типу 'NULL', і кількість дорівнює нулю.
Зубний Герман

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)))є коротшою альтернативою.
Вінсент Бонхомме

1
Не працювало для мене :( Довелося змінити його на: na_count <- застосувати (x, функцію (y) суму (is.na (y)), MARGIN = 2)
Angel Garcia Campos

Я не думаю, що нам потрібно використовувати як суму, так і функцію довжини (у першому призначенні na_count)? Просто довжина повинна бути достатньою.
Yandle


18

Якщо ви хочете підрахувати кількість 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 у дещо коротшому синтаксисі purrr як: df %>% map_df(~sum(is.na(.)))або без dplyr якmap_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

6

Швидке та просте рішення 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)))
користувач3495945

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

Примітка: tilde ( ~) створює анонімну функцію. І "." посилається на вхід для анонімної функції, в даному випадку - 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)))

Див. " Пояснення відповідей на основі коду ". Хоча це може бути технічно коректним, воно не пояснює, чому воно вирішує проблему або має бути обрана відповідь. Ми повинні додатково навчатись, щоб допомогти вирішити проблему.
Олов'яний чоловік
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.