Oto mały fragment kodu, który napisałem, aby zgłosić zmienne z brakującymi wartościami z ramki danych. Próbuję wymyślić bardziej elegancki sposób, aby to zrobić, taki, który być może zwraca ramkę danych, ale utknąłem:
for (Var in names(airquality)) {
missing <- sum(is.na(airquality[,Var]))
if (missing > 0) {
print(c(Var,missing))
}
}
Edycja: mam do czynienia z ramkami data.frames zawierającymi dziesiątki lub setki zmiennych, więc kluczowe jest, abyśmy raportowali tylko zmienne z brakami danych.
r
dataframe
missing-data
Zach
źródło
źródło
table
z postaci i musiałbyś przeanalizować liczbę NA.Odpowiedzi:
Po prostu użyj
sapply
> sapply(airquality, function(x) sum(is.na(x))) Ozone Solar.R Wind Temp Month Day 37 7 0 0 0 0
Możesz także użyć
apply
lubcolSums
na macierzy utworzonej przezis.na()
> apply(is.na(airquality),2,sum) Ozone Solar.R Wind Temp Month Day 37 7 0 0 0 0 > colSums(is.na(airquality)) Ozone Solar.R Wind Temp Month Day 37 7 0 0 0 0
źródło
M <- sapply(airquality, function(x) sum(is.na(x))); M[M>0]
M <- colSums(is.na(airquality)); M[M <= 0]
Możemy użyć
map_df
z mruczeniem.library(mice) library(purrr) # map_df with purrr map_df(airquality, function(x) sum(is.na(x))) # A tibble: 1 × 6 # Ozone Solar.R Wind Temp Month Day # <int> <int> <int> <int> <int> <int> # 1 37 7 0 0 0 0
źródło
map_df
nadsapply
?map_df( air quality, ~sum(is.na(.) )
map_df
oversapply
jest tylko wtedy, gdy wynik ma wiele wierszy, ponieważ format wyjściowy map_df jest zawsze tibble.vapply
vssapply
w funkcjach, ponieważvapply
daje znaną strukturę wyników (którą określasz).sapply
może zwrócić tablicę lub listę, w zależności od wyniku funkcji. Wadą programumap_df
jest to, że jako dane wejściowe nadajesz mu data.frame, która zwraca podklasę data.frame, a nie data.frame. Nie ma gwarancji, że tibbles będą zachowywać się tak samo, jak data.frames we wszystkich niezbędnych przypadkach w przyszłości.Moim nowym ulubionym (niezbyt szerokim) danymi są metody z doskonałego pakietu naniar . Otrzymujesz nie tylko częstotliwości, ale także wzorce braków:
Często warto zobaczyć, gdzie są chybienia w stosunku do braków, które można osiągnąć, wykreślając wykres punktowy z brakami:
Lub dla zmiennych kategorialnych:
Te przykłady pochodzą z winiety pakietu, która zawiera listę innych interesujących wizualizacji.
źródło
gg_miss_upset()
najnowszej wersji dostępna jest teraz dedykowana funkcja, która zostanie przesłana do CRAN po powrocie z wakacji. naniar.njtierney.com/reference/gg_miss_upset.htmljuż podaje te informacje
W VIM pakiety oferuje również kilka przyjemnych brakującą działkę danych dla data.frame
library("VIM") aggr(airquality)
źródło
Bardziej zwięzłe-:
sum(is.na(x[1]))
To jest
x[1]
Spójrz na pierwszą kolumnęis.na()
prawda, jeśli takNA
sum()
TRUE
jest1
,FALSE
jest0
źródło
NA
s dla wszystkich kolumn w danychKolejna alternatywa graficzna -
plot_missing
funkcja z doskonałegoDataExplorer
pakietu:Docs zwraca również uwagę na fakt, że możesz zapisać te wyniki do dodatkowej analizy za pomocą
missing_data <- plot_missing(data)
.źródło
plot_missing()
Funkcja wDataExplorer
pakiecie jest terazPlotMissing()
.PlotMissing()
jest przestarzałe. Użyjplot_missing()
zamiast tego. Zobacz nr 49, aby uzyskać więcej informacji.Inną funkcją, która pomogłaby w przejrzeniu brakujących danych, byłaby df_status z biblioteki funModeling
iris.2 to zbiór danych tęczówki z kilkoma dodanymi NA. możesz go zastąpić swoim zbiorem danych.
To da ci liczbę i procent NA w każdej kolumnie.
źródło
Jeszcze jedno rozwiązanie graficzne, oferty
visdat
pakietowevis_miss
.Bardzo podobne do
Amelia
wyników z niewielką różnicą polegającą na podawaniu% s braków po wyjęciu z pudełka.źródło
Myślę, że biblioteka Amelia dobrze radzi sobie z obsługą brakujących danych, zawiera również mapę do wizualizacji brakujących wierszy.
install.packages("Amelia") library(Amelia) missmap(airquality)
Możesz również uruchomić następujący kod, który zwróci wartości logiczne na
row.has.na <- apply(training, 1, function(x){any(is.na(x))})
źródło
Innym graficznym i interaktywnym sposobem jest użycie
is.na10
funkcji zheatmaply
biblioteki:library(heatmaply) heatmaply(is.na10(airquality), grid_gap = 1, showticklabels = c(T,F), k_col =3, k_row = 3, margins = c(55, 30), colors = c("grey80", "grey20"))
Prawdopodobnie nie będzie działać dobrze z dużymi zbiorami danych.
źródło
Jeśli chcesz to zrobić dla określonej kolumny, możesz również tego użyć
length(which(is.na(airquality[1])==T))
źródło
Funkcji pakietu ExPanDaR
prepare_missing_values_graph
można użyć do eksploracji danych panelu:źródło
dplyr
Rozwiązaniem uzyskać zliczania mogą być:summarise_all(df, ~sum(is.na(.)))
Lub aby otrzymać procent:
summarise_all(df, ~(sum(is_missing(.) / nrow(df))))
Może warto również zauważyć, że brakujące dane mogą być brzydkie, niespójne i nie zawsze zakodowane w
NA
zależności od źródła lub sposobu obsługi podczas importowania. Następującą funkcję można dostosować w zależności od danych i tego, czego brakuje:is_missing <- function(x){ missing_strs <- c('', 'null', 'na', 'nan', 'inf', '-inf', '-9', 'unknown', 'missing') ifelse((is.na(x) | is.nan(x) | is.infinite(x)), TRUE, ifelse(trimws(tolower(x)) %in% missing_strs, TRUE, FALSE)) } # sample ugly data df <- data.frame(a = c(NA, '1', ' ', 'missing'), b = c(0, 2, NaN, 4), c = c('NA', 'b', '-9', 'null'), d = 1:4, e = c(1, Inf, -Inf, 0)) # counts: > summarise_all(df, ~sum(is_missing(.))) a b c d e 1 3 1 3 0 2 # percentage: > summarise_all(df, ~(sum(is_missing(.) / nrow(df)))) a b c d e 1 0.75 0.25 0.75 0 0.5
źródło