cut
Konvertovat proměnnou typu numeric na faktor
cut {base} | Dokumentace R v češtině |
Popis
cut
rozděluje rozsah x
na intervaly a kódouje hodnoty v x
podle toho, do kterého intervalu spadají. Levý interval odpovídá úrovni první, další úrovni druhé a tak dále.
Použití
cut(x, ...)
## Výchozí S3 metoda:
cut(x, breaks, labels = NULL,
include.lowest = FALSE, right = TRUE, dig.lab = 3,
ordered_result = FALSE, ...)
Argumenty
x |
vektor typu numeric, který má být konvertován na faktor pomocí řezání. |
breaks |
buď číselný vektor dvou nebo více jedinečných bodů řezu nebo jediné číslo (větší nebo rovno 2) udávající počet intervalů, do nichž má být |
labels |
štítky pro úrovně výsledné kategorie. Ve výchozím nastavení jsou štítky konstruovány pomocí intervalové notace |
include.lowest |
proměnná typu logical indikující, zda by měla být zahrnuta hodnota ‘x[i]’ rovnající se nejnižší (nebo nejvyšší, pro |
right |
proměnná typu logical indikující, zda by intervaly měly být uzavřeny vpravo (a otevřeny vlevo) nebo naopak. |
dig.lab |
integer, které se používá, když labels nejsou zadány. Určuje počet číslic používaných při formátování čísel breaks. |
ordered_result |
logical: má být výsledek seřazeným faktorem? |
... |
další argumenty přenesené na jiné metody nebo z jiných metod. |
Detaily
Když jsou breaks
zadány jako jediné číslo, rozsah dat je rozdělen na kusy breaks
stejné délky a potom jsou vnější hranice posunuty o 0,1% rozsahu, aby se zajistilo, že obě extrémní hodnoty spadají do intervalů break. (Pokud je x
konstantní vektor, vytvoří se intervaly stejné délky, z nichž jeden obsahuje jedinou hodnotu.)
Je-li zadán parametr labels
, jeho hodnoty se používají k označení úrovní faktorů. Není-li zadán žádný, jsou štítky úrovně faktoru konstruovány jako "(b1, b2]"
, "(b2, b3]"
atd. pro right = TRUE
a jako "[b1, b2)"
, ... pokud je right = FALSE
. V tomto případě dig.lab
indikuje, že při formátování čísel b1
, b2
, .... by se měl použít minimální počet číslic. V případě potřeby bude použita větší hodnota (až 12) pro rozlišení mezi libovolnými dvojicemi koncových bodů: pokud tohle zlyhá, budou použity labels jako například "Range3"
. Formátování se provádí pomocí formatC
.
Výchozí metoda seřadí numerický vektor breaks
, ale jiné metody se nevyžadují a labels
budou odpovídat intervalům po třídění.
Od R 3.2.0, se konzultuje getOption("OutDec")
, když jsou konstruovány štítky pro labels = NULL
.
Hodnota
Je vrácen factor
, pokud labels = FALSE
, což vede k vektoru typu integer úrovňových kódů.
Hodnoty, které nespadají do rozmezí breaks
, jsou kódovány jako NA
, stejně jako hodnoty NaN
a NA
values.
Poznámka
Namísto table(cut(x, br))
, je hist(x, br, plot = FALSE)
efektivnější a méně náročný na paměť. Namísto cut(*, labels = FALSE)
, je findInterval()
efektivnější.
Reference
Becker, R. A., Chambers, J. M. and Wilks, A. R. (1988) The New S Language. Wadsworth & Brooks/Cole.
Viz také
split
pro rozdělení proměnné podle skupinového faktoru; factor
, tabulate
, table
, findInterval
.
kvantil
pro způsoby výběru breaks zhruba stejného obsahu (spíše než délky).
.bincode
pro základní verzi.
Příklady
Z <- stats::rnorm(10000)
table(cut(Z, breaks = -6:6))
sum(table(cut(Z, breaks = -6:6, labels = FALSE)))
sum(graphics::hist(Z, breaks = -6:6, plot = FALSE)$counts)
cut(rep(1,5), 4) #-- dummy
tx0 <- c(9, 4, 6, 5, 3, 10, 5, 3, 5)
x <- rep(0:8, tx0)
stopifnot(table(x) == tx0)
table( cut(x, b = 8))
table( cut(x, breaks = 3*(-2:5)))
table( cut(x, breaks = 3*(-2:5), right = FALSE))
##--- něktené hodnoty MIMO breaks :
table(cx <- cut(x, breaks = 2*(0:4)))
table(cxl <- cut(x, breaks = 2*(0:4), right = FALSE))
which(is.na(cx)); x[is.na(cx)] #-- the first 9 values 0
which(is.na(cxl)); x[is.na(cxl)] #-- the last 5 values 8
## Konstrukce štítku:
y <- stats::rnorm(100)
table(cut(y, breaks = pi/3*(-3:3)))
table(cut(y, breaks = pi/3*(-3:3), dig.lab = 4))
table(cut(y, breaks = 1*(-3:3), dig.lab = 4))
# extra digits don't "harm" here
table(cut(y, breaks = 1*(-3:3), right = FALSE))
#- the same, since no exact INT!
## Někdy výchozí dig.lab nestačí, aby se předešlo nejasnostem:
aaa <- c(1,2,3,4,5,2,3,4,5,6,7)
cut(aaa, 3)
cut(aaa, 3, dig.lab = 4, ordered = TRUE)
## jeden způsob, jak extrahovat hraniční body
labs <- levels(cut(aaa, 3))
cbind(lower = as.numeric( sub("\((.+),.*", "\1", labs) ),
upper = as.numeric( sub("[^,]*,([^]]*)\]", "\1", labs) ))