NA
Not available / chybějící hodnoty
NA {base} | Dokumentace R v češtině |
Popis
NA
je logická konstanta délky 1, obsahující indikátor chybějící hodnoty. NA
lze konvertovat na libovolný jiný typ vektoru mimo typu raw. Existují také konstanty NA_integer_
, NA_real_
, NA_complex_
a NA_character_
ostatních atomických vektorových typů, které odpovídají chybějícím hodnotám. Všechny patří mezi rezervovaná slova jazyka R.
Generická funkce is.na
slouží ke zjištění chybějících prvků.
Generická funkce is.na<-
nastavuje prvky na NA
.
Generická funkce anyNA
implementuje funkci any(is.na(x))
potenciálně rychlejším způsobem (zejména pro atomické vektory).
Použití
NA
is.na(x)
anyNA(x, recursive = FALSE)
## S3 metoda pro tridu 'data.frame'
is.na(x)
is.na(x) <- value
Argumenty
x |
R objekt k otestování: implicitní metoda pro is.na zpracovává atomické vektory, seznamy (list) a párové seznamy (pairlist): funkce pro anyNA umí také zpracovat NULL . |
recursive |
logická hodnota: má být funkce anyNA použita rekurzivně na seznamy (list) a párové seznamy (pairlist)? |
value |
vhodný indexový vektor pro použití s x . |
Detaily
Hodnota NA
typu character není totéž, co textový řetězec "NA"
. Programátoři, kteří potřebují explicitně vyjádřit chybějící hodnotu textového řetězce mohou použít výraz NA_character_
(namísto nesymyslného "NA"
) nebo nastavit prvky vektoru na NA
pomocí funkce is.na<-
.
is.na
a anyNA
jsou generické: lze vytvářet metody pro zpracování specifických tříd objektů, viz InternalMethods
.
Funkce is.na<-
nabízí bezpečnější cestu k nastavení chybějících hodnot. Například se chová jinak v případě faktorů.
Numerické výpočty pracující s hodnotou NA
běžně vrací výsledek NA
: možnou výjimkou je současné zpracování hodnot NaN (not a number), které se mohou rovněž objevit ve výsledku. Logické výpočty zpracovávají NA
jako chybějící hodnotu TRUE/FALSE a tím pádem může být jejich výsledkem TRUE nebo FALSE, poklud není logický výraz závislý na operandu NA
.
Implicitní metoda pro anyNA
zpracovává atomické vektory bez tříd a hodnotu NULL. Volá se ve tvaru any(is.na(x))
na objekty se třídami, pro recursive = FALSE
, na seznamu (list) a párové seznamy (pairlist).
Hodnota
Implicitní metoda pro is.na
aplikovaná na atomický vektor vrací vektor logických hodnot o stejné délce, jako je délka argumentu x
, obsahující prvky TRUE
pro prvky NA
, případně NaN pro vektory typu numeric a complex a FALSE
v ostatních případech. (Komplexní hodnota má přiřazenu hodnotu NA
v případě, že je její imaginární nebo reálná (příp. obě) část rovna NA
nebo NaN
. Atributy dim
, dimnames
and names
přechází na výsledek beze změny.
Implicitní metody umí také zpracovat seznamy (list) a párové seznamy (pairlist):
Pro is.na
je po prvcích výsledek roven FALSE
kromě případů, kdy je daný prvek jednoprvkový atomický vektor a jediným oprvkem tohoto vektoru je hodnota NA
nebo NaN
(povšimněte si, že jakákoliv is.na
metoda pro třídu prvku je ignorována).
Funkce (recursive = FALSE)anyNA
funguje stejně jako is.na
; funkce anyNA(recursive = TRUE)
aplikuje anyNA
na každý prvek jednotlivě.
Metoda is.na
pro datové rámce vrací matici logických hodnot o stejné dimenzi jako původní datový rámec s názvy dimenzí (dimnames) převzatými z řádkových a sloupcových názvů původního datového rámce.
anyNA(NULL)
vrací FALSE
: is.na(NULL)
vrací logical(0)
s varováním.
Reference
Becker, R. A., Chambers, J. M. and Wilks, A. R. (1988) The New S Language. Wadsworth & Brooks/Cole.
Chambers, J. M. (1998) Programming with Data. A Guide to the S Language. Springer.
Příklady
is.na(c(1, NA)) #> FALSE TRUE
is.na(paste(c(1, NA))) #> FALSE FALSE
(xx <- c(0:4))
is.na(xx) <- c(2, 4)
xx #> 0 NA 2 NA 4
anyNA(xx) # TRUE
# Nektere logicke operace nevraci NA
c(TRUE, FALSE) & NA
c(TRUE, FALSE) | NA
## Mereni rozdilu vypocetni rychlosti v oblibenych pripadech:
## rozdil zavisi na platforme, obvykle cca 3x.
x <- 1:10000; x[5000] <- NaN # zmeni x na double
if(require("microbenchmark")) { # nefunguje spolehlive na vsech platformach
print(microbenchmark(any(is.na(x)), anyNA(x)))
} else {
nSim <- 2^13
print(rbind(is.na = system.time(replicate(nSim, any(is.na(x)))),
anyNA = system.time(replicate(nSim, anyNA(x)))))
}
## anyNA() muze fungovat rekurzivne se seznamy (list):
LL <- list(1:5, c(NA, 5:8), c("A","NA"), c("a", NA_character_))
L2 <- LL[c(1,3)]
sapply(LL, anyNA); c(anyNA(LL), anyNA(LL, TRUE))
sapply(L2, anyNA); c(anyNA(L2), anyNA(L2, TRUE))
## ... kdyz pro seznamy, tak take pro datove ramce:
dN <- dd <- USJudgeRatings; dN[3,6] <- NA
anyNA(dd) # FALSE
anyNA(dN) # TRUE