R Language
Brakujące wartości
Szukaj…
Wprowadzenie
Kiedy nie wiemy, jaką wartość przyjmuje zmienna, mówimy, że jej wartości brakuje, co wskazuje NA .
Uwagi
Brakujące wartości są reprezentowane przez symbol NA (niedostępne). Niemożliwe wartości (np. W wyniku sqrt(-1) ) są reprezentowane przez symbol NaN (nie liczbę).
Badanie brakujących danych
anyNA zgłasza, czy istnieją jakieś brakujące wartości; while is.na raportuje brakujące wartości elementarnie:
vec <- c(1, 2, 3, NA, 5)
anyNA(vec)
# [1] TRUE
is.na(vec)
# [1] FALSE FALSE FALSE TRUE FALSE
ìs.na zwraca wektor logiczny, który jest wymuszany na wartości całkowite w operacjach arytmetycznych (z FAŁSZ = 0, PRAWDA = 1). Możemy to wykorzystać, aby dowiedzieć się, ile brakujących wartości:
sum(is.na(vec))
# [1] 1
Rozszerzając to podejście, możemy użyć colSums i is.na w ramce danych do zliczenia NA na kolumnę:
colSums(is.na(airquality))
# Ozone Solar.R Wind Temp Month Day
# 37 7 0 0 0 0
Pakiet naniar (obecnie na github, ale nie CRAN) oferuje dalsze narzędzia do badania brakujących wartości.
Odczytywanie i zapisywanie danych z wartościami NA
Podczas odczytywania tabelarycznych zestawów danych za pomocą funkcji read.* R automatycznie wyszukuje brakujące wartości, które wyglądają jak "NA" . Jednak brakujące wartości nie zawsze są reprezentowane przez NA . Czasami kropka ( . ), Łącznik ( - ) lub wartość znakowa (np .: empty ) wskazuje, że wartością jest NA . Za na.strings parametru na.strings funkcji read.* Można powiedzieć R, które symbole / znaki należy traktować jako wartości NA :
read.csv("name_of_csv_file.csv", na.strings = "-")
Można również wskazać, że więcej niż jeden symbol należy odczytać jako NA :
read.csv('missing.csv', na.strings = c('.','-'))
Podobnie NA można pisać za pomocą niestandardowych ciągów, używając argumentu na do write.csv . Inne narzędzia do czytania i pisania tabel mają podobne opcje.
Korzystanie z NA różnych klas
Symbol NA oznacza brak logical wartości:
class(NA)
#[1] "logical"
Jest to wygodne, ponieważ można je łatwo przymusić do innych typów wektorów atomowych, a zatem zazwyczaj jest to jedyna NA potrzebna:
x <- c(1, NA, 1)
class(x[2])
#[1] "numeric"
Jeśli potrzebujesz pojedynczej wartości NA innego typu, użyj NA_character_ , NA_integer_ , NA_real_ lub NA_complex_ . W przypadku brakujących wartości fantazyjnych klas zwykle działa NA_integer_ ; na przykład, aby uzyskać brakującą wartość Data:
class(Sys.Date()[NA_integer_])
# [1] "Date"
PRAWDA / FAŁSZ i / lub NA
NA jest typem logicznym, a operator logiczny z NA zwróci NA jeśli wynik będzie niejednoznaczny. Poniżej NA OR TRUE ocenia na TRUE ponieważ co najmniej jedna strona ocenia na TRUE , jednak NA OR FALSE zwraca NA ponieważ nie wiemy, czy NA byłaby TRUE czy FALSE
NA | TRUE
# [1] TRUE
# TRUE | TRUE is TRUE and FALSE | TRUE is also TRUE.
NA | FALSE
# [1] NA
# TRUE | FALSE is TRUE but FALSE | FALSE is FALSE.
NA & TRUE
# [1] NA
# TRUE & TRUE is TRUE but FALSE & TRUE is FALSE.
NA & FALSE
# [1] FALSE
# TRUE & FALSE is FALSE and FALSE & FALSE is also FALSE.
Te właściwości są pomocne, jeśli chcesz podzestawić zestaw danych na podstawie niektórych kolumn zawierających NA .
df <- data.frame(v1=0:9,
v2=c(rep(1:2, each=4), NA, NA),
v3=c(NA, letters[2:10]))
df[df$v2 == 1 & !is.na(df$v2), ]
# v1 v2 v3
#1 0 1 <NA>
#2 1 1 b
#3 2 1 c
#4 3 1 d
df[df$v2 == 1, ]
v1 v2 v3
#1 0 1 <NA>
#2 1 1 b
#3 2 1 c
#4 3 1 d
#NA NA NA <NA>
#NA.1 NA NA <NA>
Pominięcie lub zastąpienie brakujących wartości
Przekodowanie brakujących wartości
Zwykle brakujące dane nie są kodowane jako NA w zestawach danych. Na przykład w SPSS brakujące wartości są często reprezentowane przez wartość 99 .
num.vec <- c(1, 2, 3, 99, 5)
num.vec
## [1] 1 2 3 99 5
Możliwe jest bezpośrednie przypisanie NA za pomocą podzbioru
num.vec[num.vec == 99] <- NA
Jednak preferowaną metodą jest is.na<- jak poniżej. Plik pomocy ( ?is.na ) stwierdza:
is.na<-może zapewnić bezpieczniejszy sposób na ustalenie braków. Na przykład zachowuje się inaczej w przypadku czynników.
is.na(num.vec) <- num.vec == 99
Obie metody powracają
num.vec
## [1] 1 2 3 NA 5
Usuwanie brakujących wartości
Brakujące wartości można usunąć z wektora na kilka sposobów:
num.vec[!is.na(num.vec)]
num.vec[complete.cases(num.vec)]
na.omit(num.vec)
## [1] 1 2 3 5
Wyłączając brakujące wartości z obliczeń
Podczas korzystania z funkcji arytmetycznych na wektorach z brakującymi wartościami zwracana jest brakująca wartość:
mean(num.vec) # returns: [1] NA
Parametr na.rm mówi funkcji, aby wykluczyła wartości NA z obliczeń:
mean(num.vec, na.rm = TRUE) # returns: [1] 2.75
# an alternative to using 'na.rm = TRUE':
mean(num.vec[!is.na(num.vec)]) # returns: [1] 2.75
Niektóre funkcje R, takie jak lm , mają parametr na.action . Wartością domyślną jest na.omit , ale w przypadku options(na.action = 'na.exclude') domyślne zachowanie R można zmienić.
Jeśli zmiana domyślnego zachowania nie jest konieczna, ale w konkretnej sytuacji potrzebna jest kolejna na.action , Parametr na.action musi zostać uwzględniony w wywołaniu funkcji, np .:
lm(y2 ~ y1, data = anscombe, na.action = 'na.exclude')