Bepaal het aantal NA-waarden in een kolom

Ik wil het aantal NA-waarden in een dataframekolom tellen. Stel dat mijn dataframe dfheet, en de naam van de kolom die ik overweeg is col. De manier waarop ik ben gekomen is als volgt:

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

Is dit een goede/meest efficiënte manier om dit te doen?


Antwoord 1, autoriteit 100%

Je denkt te veel na over het probleem:

sum(is.na(df$col))

Antwoord 2, autoriteit 24%

Als u zoekt naar NA-tellingen voor elke kolom in een dataframe, dan:

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

zou u een lijst moeten geven met de tellingen voor elke kolom.

na_count <- data.frame(na_count)

Zou de gegevens netjes moeten weergeven in een dataframe zoals:

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

Antwoord 3, autoriteit 14%

Probeer de functie colSums

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

Antwoord 4, autoriteit 6%

Als u het aantal NA’s in het gehele dataframe wilt tellen, kunt u ook gebruik maken van

sum(is.na(df))

Antwoord 5, autoriteit 4%

In de summary()OUTPUT, de functie telt ook de NAS, zodat u deze functie kunt gebruiken als u de som van NAS in verschillende variabelen.


Antwoord 6, Autoriteit 4%

Een snelle en gemakkelijke opgeruimde oplossing om een ​​NATELLEN VOOR ALLE KOLOMMEN TE KRIJGEN, is het gebruik summarise_all()waarvan ik denk dat het een veel eenvoudiger te lezen oplossing maakt dan het gebruik van purrrOF 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

of gebruik de modernere across()functie:

df %>% summarise(across(everything(), ~ sum(is.na(.))))

Antwoord 7, Autoriteit 3%

Een opgeruimde manier om het aantal nulls in elke kolom van een dataframe te tellen:

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

Antwoord 8, Autoriteit 2%

Dit formulier, enigszins gewijzigd van Kevin Ogoros’s One:

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

Retourneert NA-telt zoals de naam int array


Antwoord 9

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

Antwoord 10

Probeer dit:

length(df$col[is.na(df$col)])

Antwoord 11

Het antwoord van de gebruiker is juist, maar dat vertelt je alleen het aantal NA-waarden in de specifieke kolom van het dataframe dat je doorgeeft om het aantal NA-waarden voor het hele dataframe te krijgen, probeer dit:

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

Dit doet de truc


Antwoord 12

Ik lees een csv-bestand uit de lokale map. De volgende code werkt voor mij.

# 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

Antwoord 13

Vergelijkbaar met het antwoord van hute37, maar met het pakket purrr. Ik denk dat deze opgeruimde aanpak eenvoudiger is dan het door AbiK voorgestelde antwoord.

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

Opmerking: de tilde (~) creëert een anonieme functie. En de ‘.’ verwijst naar de invoer voor de anonieme functie, in dit geval de data.frame df.


Antwoord 14

Als u zoekt naar null-waarden in elke kolom die na elkaar moeten worden afgedrukt, kunt u dit gebruiken. Eenvoudige oplossing.

lapply(df, function(x) { length(which(is.na(x)))})

Antwoord 15

U kunt dit gebruiken om het aantal NA of spaties in elke kolom te tellen

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

Antwoord 16

Voor de volledigheid kunt u ook het argument useNAin de tabel gebruiken. table(df$col, useNA="always")telt bijvoorbeeld alle niet-NA-gevallen en de NA-gevallen.

Other episodes