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')