Not available / chybějící hodnoty
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 (Reserved) 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 . |
Podrobnosti
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.
Viz také
NaN , is.nan atd. a užitečnou funkci complete.cases .
na.action , na.omit , na.fail pro ladění jiných funkcí za účelem zpracování chybějících hodnot.
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
|