as.factor
Factor
factor {base} | Dokumentace R v češtině |
Popis
Funkce factor
převede vektor na faktor (pojmy jako ‘kategorie’ and ‘výčtový typ’ jsou také u faktorů používány). Má-li argument ordered
hodnotu TRUE
, jsou faktorové úrovně seřazeny. Pro kompatibilitu s S je zde funkce ordered
.
is.factor
, is.ordered
, as.factor
a as.ordered
jsou funkce sloužící k ověřování náležitosti k dané třídě či k převodu do dané třídy.
Použití
factor(x = character(), levels, labels = levels,
exclude = NA, ordered = is.ordered(x), nmax = NA)
ordered(x, ...)
is.factor(x)
is.ordered(x)
as.factor(x)
as.ordered(x)
addNA(x, ifany = FALSE)
Argumenty
x |
vektor dat, obvykle obsahuje malý počet zřetelně odlišných hodnot values. |
levels |
nepovinný vektor, který obsahuje všechny honoty (jako řetězce znaků), které může |
labels |
buď nepovinný vektor řetězců obsahující štítky pro jednotlivé faktorové úrovně, které má být použito na výstupu (musí být vložen se stejným poředím jako argument |
exclude |
vektor hodnot, které mají být vyloučeny při vytváření množiny úrovní. Může být faktor se stejnou množinou úrovní jako |
ordered |
logický příznak, který umožňuje zvolit, zda má být na úrovně pohlíženo jako na seřazené (v určitém pořadí). |
nmax |
horní hranice pro počet úrovní; viz ‘Detaily’. |
... |
(u |
ifany |
pouze přidává úroveň |
Detaily
Na datové typy vektoru x
se nevztahuje žádné omzení; jediné, co musí mít, je odpovídající metodu as.character
a musí být tříditelný (pomocí order
).
Ačkoliv se uspořádané faktory od faktorů odlišují pouze ve své třídě, zacházení s těmito třídami se poměrně liší u nejrůznějších metod a funkcí používaných k fitování modelů.
Zpracování vektoru probíhán následujícím způsobem: nejdříve dojde k odstranění všech hodnot z levels
, které jsou uvedené v exclude
. Pokud je hodnota prvku x[i]
rovna levels[j]
, pak je i
-tý prvek výsledku j
. Pokud není nalezena žádná shoda s x[i]
v levels
(typicky se tak stane u odstraněných hodnot), pak je i
-tý prvek výsledku navrácen jako NA
.
Za normálních okolností jsou ‘úrovně’, coby vlastnost výsledku, množinou všech původních úrovní po odstranění těch, které jsou uvedené v exclude
, ovšem situace může být jiná, je-li poskytnut argument labels
. V takovém případě jsou úrovněmi výsledku buďto nové štítky úrovní, nebo řetězec znaků, přičemž jednotlivé úrovně jsou označeny příslušným řetězcem s přidaným pořadovým číslem.
factor(x, exclude = NULL)
, použité u faktoru bez NA
, nepovede k žádné operaci pouze v případě, že se mezi úrovněmi nenacházejí nepoužité úrovně. Pokud ano, bude navrácen faktor s redukovanou množinou úrovní. Pokud je argument exclude
použitý, pak od verze R 3.4.0 platí, že vyřazení neexistujících úrovní je ekvivalentní žádnému vyřazení, a pokud je exclude
vektor řetězců, je použitý na úrovně x
. exclude
může být případně i faktor se stejnou množinou úrovní jako x
. Dojde tak k vyřazení úrovní přítomných v exclude
.
Faktor může obsahovat NA
. Pro x
typu numeric, nastavte exclude = NULL
, aby se z NA
stala další úroveň (zobrazená jako <NA>
); dle výchozího nastavení se jedná o poslední úroveň.
Pokud je NA
úrovní, pak způsob, jakým se dá nastavit kód chybějící hodnoty (což je protiklad kódu chybějící úrovně), je použití is.na
na levé straně přiřazení (jako v is.na(f)[i] <- TRUE
; indexování uvnitř is.na
nefunguje). Za takových podmínek jsou chybějící hodnoty zobrazeny stejně jako chybějící úroveň, tedy <NA>
.
is.factor
je generická funkce: můžete tedy vytvářet metody pro specifické třídy objektů.
Tam, kde není poskytnut argumentlevels
, je volána funkce unique
. Jelikož faktory typicky mívají malý počet úrovní, je u velkých vektorů x
užitečné zadat nmax
coby horní hranici pro počet jedinečných hodnot.
Hodnota
factor
navrací objekt třídy "factor"
, která obsahuje množinu celočíselných kódů délky x
s vlastností "levels"
typu character
, a jedinečné vstupní hodnoty. Pokud je pravdivý argument ordered
(nebo je použito ordered()
), má výsledek třídu c("ordered", "factor")
. factor(x)
pozbývá veškeré vlastnosti x
kromě "names"
, a nastavuje nově "levels"
a "class"
.
Použití funkce factor
u seřazených či neseřazených faktorů povede k navrácení faktoru (stejného typu) pouze s úrovněmi, které se v něm skutečně vyskytují.
is.factor
navrací TRUE
nebo FALSE
v závislosti na tom, zda je argument třídy faktor či ne. Obdobně pak is.ordered
navrací TRUE
, když je její argument uspořádáný faktor a FALSE
v případě, že není.
as.factor
převádí svůj argument na faktor. Jedná se o zkrácenou verzí (někdy i rychlejší) funkce factor
.
as.ordered(x)
navrací x
, pokud je seřazené. V ostatních případech se použije ordered(x)
.
addNA
modifikuje faktor převedením hodnoty NA
do množiny úrovní (tedy NA
hodnoty jsou počítány v tabulkách, například).
.valid.factor(object)
kontroluje platnost faktoru, momentálně pouze levels(object)
, a navrátí TRUE
, pokud je vše platné. V opačném případě řetězec popisující problém. Tato funkce se používá pro validObject(<factor>)
.
Varování
Interpretace faktoru závisí na obojím, tedy jak na samotných kódech, tak na vlastnosti "levels"
. Dávejte si proto pozor, abyste porovnávali pouze faktory se stejnou množinou úrovní (ve stejném pořadí). Především je bezvýznamné používat u faktoru funkci as.numeric
, které může vést k implicitnímu převedení. K transformaci faktoru f
do jeho zhruba původních číselných hodnot je doporučeno použít as.numeric(levels(f))[f]
. Je to i více efektivní než as.numeric(as.character(f))
.
Úrovně faktoru jsou dle výchozího nastavení seřazeny, ovšem pořadí závisí na místním nastavení v době vzniku faktoru, a nemělo by se automaticky pedpokládat ASCII.
U používání NA
jako úrovně může dojít k určitým obtížím. Je proto doporučenou této možnosti využívat pouze při zanášení dat do tabulky.
Operátory ke srovnávání a skupinové generické metody
Existují metody "factor"
a "ordered"
pro group generic funkci
Ops
, které poskytují metody pro operátory k Comparison, dále pro min
, max
a generickou funkci range
v Summary
funkce "ordered"
. (Zbytek skupin a skupina Math
hlásí chybu, neboť nemají pro faktory žádný význam.)
Pouze
==
a !=
může být použito u faktorů: faktor může být porovnán pouze s dalším faktorem se stejnou množinou úrovní (není nezbytné stejné pořadí) nebo s vektorem řetězců. Uspořádané faktory jsou porovnávány steným způsobem, ovšem porovnání uspořádaných a neuspořádaných faktorů není umožněno.
Všechny operátory ke srovnávání jsou k dispozici pro uspořádané faktory. Řazení je provedeno podle úrovní operandů: pokud jsou oba operandy uspořádané faktory, musí mýt stejnou množinu úrovní.
Poznámka
Ve starších verzích R mělo přechovávání dat řetězců coby faktory větší nároky na místo i v případě, že data obsahovala pouze malé množství opakujících se hodnot. Dnes jsou nároky na místo srovnatelné. (Hodnoty typu integer jsou ukládány ve 4 bajtech, zatímco každý odkaz na řetězec znaků potřebuje ukazatel velikosti 4 nebo 8 bajtů.)
Reference
Chambers, J. M. and Hastie, T. J. (1992) Statistical Models in S. Wadsworth & Brooks/Cole.
Příklady
(ff <- factor(substring("statistics", 1:10, 1:10), levels = letters))
as.integer(ff) # vnitřní kódy
(f. <- factor(ff)) # vypuštění úrovní, které se nevyskytují
ff[, drop = TRUE] # stejné, více přehledné
factor(letters[1:20], labels = "letter")
class(ordered(4:1)) # "ordered", děděné z "factor"
z <- factor(LETTERS[3:1], ordered = TRUE)
## jak pracují "příbuzné" metody:
stopifnot(sort(z)[c(1,3)] == range(z), min(z) < max(z))
## pokud chcete "NA" jako úroveň a zároveň povolit chybějící hodnoty
(x <- factor(c(1, 2, NA), exclude = NULL))
is.na(x)[2] <- TRUE
x # [1] 1 <NA> <NA>
is.na(x)
# [1] FALSE TRUE FALSE
## Od verze R 3.4.0 lze také takto :
factor(c(1:2, NA), exclude = "" ) # chová všechny <NA> jako
factor(c(1:2, NA), exclude = NULL)
## exclude = <character>
z # uspořádané ůrovně 'A < B < C'
factor(z, exclude = "C") # vyloučí C
factor(z, exclude = "B") #
## Štítky se mohou opakovat:
## factor() s opakujícími se štítky, což umožňuje "spojení urovní"
x <- c("Man", "Male", "Man", "Lady", "Female")
## Od 4 různých hodnot ke dvěma úrovním:
(xf <- factor(x, levels = c("Male", "Man" , "Lady", "Female"),
labels = c("Male", "Male", "Female", "Female")))
#> [1] Male Male Male Female Female
#> Levels: Male Female
## Používání addNA()
Month <- airquality$Month
table(addNA(Month))
table(addNA(Month, ifany = TRUE))