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


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow