Factor in R: Kategorikus változók és folyamatos változók
⚡ Okos összefoglaló
Az R Factor nyelve a kategorikus adatokat egész számokból álló kódok vektoraként tárolja, amelyekhez szinteket rendelnek. Ez az, ahogyan a nyelv elkülöníti a kategóriák egy korlátozott csoportját a folytonos méréstől.
Mi az a faktor az R-ben?
Tényező az R-ben egy változó, amely az adatok kategorizálására és tárolására szolgál, korlátozott számú különböző értékkel. Az adatokat egész értékek vektoraként tárolja. Az R-ben a Factor egy kategorikus változóként is ismert, amely karakterlánc és egész adatértékeket is tárol szintként. A Factor-t főként statisztikai modellezésben és feltáró adatelemzésben használják az R-ben.
Egy faktor belsőleg két együtt mozgó objektum: egy kódokból álló egész számú vektor és egy karakterattribútum, melynek neve szintekMinden kód egy pozíció az adott szintvektorban, ezért egy faktor kinyomtatása szavakat jelenít meg, miközben nyílt() számokat mutat.
Egy adatkészletben kétféle változót különböztethetünk meg: kategorikus és a folyamatos.
- Az R kategorikus változóinak leíró statisztikájában az érték korlátozott, és általában egy adott véges csoporton alapul. Például az R kategorikus változója lehet országok, év, nem, foglalkozás.
- Egy folytonos változó azonban bármilyen értéket felvehet, egésztől decimálisig. Például megadhatjuk egy részvény árbevételét, árfolyamát stb.
Ezt a megkülönböztetést érdemes megőrizni, mivel az R csendben más alapértelmezett értékeket választ mindegyikhez. Egy numerikus oszlopot átlaggal és mediánnal összegez, míg egy faktort szintenkénti darabszámmal összegez. Egy kategória szövegként vagy számként történő tárolása ezért megváltoztatja a kapott elemzést. A tárolási módok szélesebb körű ismertetését a következő útmutató tartalmazza: R adattípusok és operátorok.
Kategorikus változók
Kategorikus változók in R egy faktorban tárolódnak. Nézzük meg az alábbi kódot, amely egy karakterváltozót faktorváltozóvá alakít R-ben. Sok modellezési és gépi tanulási rutin nem tud nyers szöveget felhasználni, ezért a kategóriákat szintként vagy számként kell kódolni a modell illesztése előtt.
Szintaxis
factor(x = character(), levels, labels = levels, ordered = is.ordered(x))
Az alap R hivatkozás további két argumentumot dokumentál, amelyeket a fenti rövidített forma kihagy: kizár, amely a szintkészlet felépítése előtt eltávolítja az értékeket, és nmax, a szintek számának felső korlátja, amely felgyorsítja a nagyon nagy vektorok konverzióját.
érvek:
- x: Kategóriaadatok vektora az R-ben. Karakterláncnak vagy egész számnak kell lennie, nem decimálisnak.
- szintekAz x által felvett lehetséges értékek vektora. Ez az argumentum opcionális. Az alapértelmezett érték az x vektor elemeinek egyedi listája, növekvő sorrendbe rendezve.
- címkék: Adjon hozzá egy címkét az x kategorikus adatokhoz az R-ben. Például az 1 felveheti a „férfi” címkét, míg a 0 a „nő” címkét.
- kizár: Az értékek vektora, amelyet a szinthalmaz létrehozásakor el kell dobni. A kizárt értékek NA-ként jelennek meg az eredményben.
- megrendelt: Logikai jelző, amely meghatározza, hogy a szinteket rendezettnek, a megadott sorrendben kell-e tekinteni.
- nmax: A szintek számának opcionális felső korlátja, amely hosszú vektorok esetén hasznos.
Példa:
Alakítsunk át egy karaktervektort faktorrá, és erősítsük meg a változást a class() függvénnyel.
# Create gender vector gender_vector <- c("Male", "Female", "Female", "Male", "Male") class(gender_vector) # Convert gender_vector to a factor factor_gender_vector <-factor(gender_vector) class(factor_gender_vector)
output:
## [1] "character" ## [1] "factor"
Az osztály karakterről faktorra váltott, és a kiírt értékekben semmi sem változott. Fontos átalakítani egy húr egy R-beli faktorváltozóba egy gépi tanulási feladat előtt, mert ez az a pont, ahol a kategóriák egy rögzített, validált halmazzá válnak.
Az R kategorikus változója felosztható nominális kategorikus változó és a sorszámú kategorikus változó.
Nominális kategorikus változó
Egy nominális kategorikus változónak több értéke van, de a sorrend nem számít. Például férfi vagy nő. Az R nominális kategorikus változói nem rendelkeznek sorrenddel.
# Create a color vector color_vector <- c('blue', 'red', 'green', 'white', 'black', 'yellow') # Convert the vector to factor factor_color <- factor(color_vector) factor_color
output:
## [1] blue red green white black yellow ## Levels: black blue green red white yellow
A factor_color változóból nem tudunk sorrendet megállapítani. A szintlista csak betűrendben van, mivel nem adtunk meg levels argumentumot, így az R maga rendezte az egyedi értékeket. Ez a rendezés az aktív területi beállítást követi a sima ASCII helyett, ami az egyik oka annak, hogy a szinteket explicit módon meg kell adni, amikor a sorrend számít.
Sorrendi kategorikus változó
Az ordinális kategorikus változóknak természetes sorrendjük van. A rangsorolás a vektor sorrendjéből adódik, amelyet a változónak átadunk. szintek argumentum, és az ordered = TRUE azt mondja az R-nek, hogy a sorozatot rangsorként kezelje, ne pedig egy egyszerű listaként. Az ordered = FALSE beállítás nem fordítja meg a rangsorolást; egyszerűen egy közönséges rendezetlen tényezőt hoz létre. A legmagasabbtól a legalacsonyabbig történő rangsoroláshoz magát a szintvektort kell megfordítani.
Példa:
Az összegzés segítségével megszámolhatjuk az egyes R-beli faktorváltozók értékét.
# Create Ordinal categorical vector day_vector <- c('evening', 'morning', 'afternoon', 'midday', 'midnight', 'evening') # Convert `day_vector` to a factor with ordered level factor_day <- factor(day_vector, order = TRUE, levels =c('morning', 'midday', 'afternoon', 'evening', 'midnight')) # Print the new variable factor_day
output:
## [1] evening morning afternoon midday
midnight evening
A konzol először az értékeket írja ki, alattuk pedig a rangsort. A következő blokk ezzel a Levels sorral nyílik meg, amely továbbra is kommentelt, így a rangsor látható marad, amíg a summary() hívás hozzáfűződik az előző kódhoz.
## Levels: morning < midday < afternoon < evening < midnight # Append the line to above code # Count the number of occurence of each level summary(factor_day)
output:
## morning midday afternoon evening midnight ## 1 1 1 2 1
Az R a szintet a levels argumentumban megadottak szerint „reggeltől” „éjfélig” rendezte el. Mivel a faktor rendezett, az olyan összehasonlító operátorok, mint a < és >, szintén működnek rajta, amit a fenti nominális színfaktoron nem.
Folyamatos változók
Az R alapértelmezett értéke a folytonos osztályváltozók. Numerikus vagy egész számként tárolódnak. Ezt az alábbi adathalmazból is láthatjuk. Az mtcars egy beépített adathalmaz. Különböző típusú autókról gyűjt információkat. Importálhatjuk az mtcars használatával, és ellenőrizhetjük az mpg, mérföld/gallon változó osztályát. Egy numerikus értéket ad vissza, ami egy folytonos változót jelez.
dataset <- mtcars class(dataset$mpg)
teljesítmény
## [1] "numeric"
Nem minden numerikus oszlop valóban folytonos. Ugyanabban az adathalmazban a cyl csak 4, 6 és 8 értéket tartalmaz, míg az am csak 0 és 1 értéket, tehát mindkettő olyan kategória, amely történetesen számként van tárolva. Ha a modellezés előtt a factor() függvénnyel konvertáljuk őket, az R nem kezeli a 4 és 6 henger közötti rést mért mennyiségként. A fordított lépést, a folytonos oszlop sávokra vágását a cut() végzi.
Faktorszintek és címkék az R-ben
A levels attribútum az a tényezőrész, amelynek a beállításával a legtöbb időt fogod tölteni, mivel ez szabályozza mind azt, hogy mi nyomtatódik ki, mind azt, hogy a modell mit kezel alapvonalként. Négy alap R segítő szinte minden esetet lefed.
| Funkció | Mit csinál | Tipikus felhasználás |
|---|---|---|
| szintek (f) | Felolvassa vagy lecseréli a szintneveket | Rövidítések átnevezése olvasható címkékké |
| nlevels(f) | Visszaadja a szintek számát | A kategória ellenőrzése nem robbant fel csatlakozás után |
| újraszintezés(f, hivatkozás) | Egy szinttel előrébb lép | Regresszió alapvonalának kiválasztása |
| droplevels(f) | Eltávolítja a nulla megfigyeléssel rendelkező szinteket | Tisztítás alkészletezés vagy szűrés után |
Az alábbi blokk mind a négyet alkalmazza a korábban létrehozott szín- és nemi tényezőkre.
# Inspect the levels of an existing factor levels(factor_color) # the level names, in the order R stored them nlevels(factor_color) # how many distinct levels exist # Rename the levels in place (the new vector must follow the same order) levels(factor_color) <- c('Black', 'Blue', 'Green', 'Red', 'White', 'Yellow') # Attach labels at creation time instead of renaming afterwards gender_coded <- factor(c(1, 0, 0, 1, 1), levels = c(0, 1), labels = c('female', 'male')) # Make 'male' the reference level that modelling functions compare against gender_coded <- relevel(gender_coded, ref = 'male') # Remove levels that survived a subset but no longer occur in the data subset_color <- droplevels(factor_color[1:3])
Két részletre érdemes odafigyelni. A levels() függvényhez rendelt érték pozíció szerint átnevezi az elemeket, így egy nem egyező vektor csendben átcímkézi a rossz kategóriát. Egy részhalmaz pedig minden eredeti szintet megtart, amíg a droplevels() függvény meg nem hívódik, ezért egy szűrt adatkeret továbbra is üres oszlopokat ábrázolhat. címkék Az argumentum ismét más: létrehozáskor nevezi el a szinteket, és a duplikált címkék több bemeneti értéket egyetlen szintre egyesítenek.
Hogyan konvertáljunk egy tényezőt numerikussá vagy karakteressé R-ben?
Ez az R leggyakoribb faktorhibája. Mivel egy faktor egész kódokat tárol, az as.numeric() meghívása ezeket a kódokat adja vissza a képernyőn látható értékek helyett. Egy 2021 és 2023 közötti faktor 1, 2 és 3 értékkel tér vissza.
# A factor whose labels happen to look like numbers year_factor <- factor(c('2021', '2023', '2022', '2023')) # WRONG: this returns the internal codes 1, 3, 2, 3 - not the years as.numeric(year_factor) # RIGHT: read the label through the levels attribute first as.numeric(levels(year_factor))[year_factor] # Equivalent and easier to remember, but slightly slower as.numeric(as.character(year_factor)) # Back to plain text as.character(year_factor)
Az alap R dokumentáció az as.numeric(levels(f))[f] útvonalat javasolja helyes és valamivel gyorsabb útvonalként, míg az as.numeric(as.character(f)) a könnyebben olvasható megfelelője. Mindkettő először a címkét olvassa be, és csak utána konvertálja.
- Karaktert befolyásoló tényezőAz as.character(f) függvény sima szövegként adja vissza a címkéket.
- Egész számmá alakított kódok: as.integer(f) vagy unclass(f), amikor a kódok pontosan azok, amiket szeretnél.
- A tényezőként figyelembe veendő karakter: factor(x) vagy a gyorsabb as.factor(x) gyorsbillentyű.
- Numerikus tényező: factor(x) diszkrét kódokhoz, cut(x, breaks) folytonos értékekhez, amelyek sávosítást igényelnek.
Egyetlen védelmi mechanizmus vonatkozik mindegyikre. Ha az x egy értéke nem jelenik meg a szintvektorban, a factor() az elemet NA-ra állítja a hiba helyett, így egy elszórt szóköz vagy nagybetűs különbség csendben törölheti a sorokat. Az egyedi értékek összehasonlítása a konverzió előtt és után, vagy az adatkeret rendezése az új oszlopban gyorsan feltárja a problémát.
Faktor vs. karakter vs. numerikus R-ben: Mikor használjuk mindegyiket
A tárolási mód korai kiválasztása jelentősen megspórolja a későbbi hibakeresést. A táblázat összehasonlítja a szöveg- vagy kódoszlopok három lehetséges módját.
| Ingatlanok | Tényező | Karakter | Numerikus |
|---|---|---|---|
| Tárolva mint | Egész számkódok plusz egy levels attribútum | Strings | Doubles vagy egész számok |
| Fix értékek halmaza | Igen, szintek által meghatározott | Nem | Nem |
| Egyéni megjelenítési sorrend | Igen, szinteken keresztül | Csak betűrendben | Csak numerikus |
| Számtan | Nem engedélyezett | Nem engedélyezett | Megengedett |
| Modellkontrasztok | Automatikusan épült | Először kényszerítve | Mérésként kezelve |
Használat tényező amikor az értékek egy ismert, zárt listából származnak, amikor a megjelenítési vagy rangsorolási sorrend számít, vagy amikor az oszlop egy modellt vagy egy diagramjelmagyarázatot táplál. Használja. karakter szabad szöveghez, azonosítókhoz és bármihez, amit elemezni vagy összekapcsolni fogsz, például nevekhez, jegyzetekhez és kódokhoz, amelyek folyamatosan új értékekkel érkeznek. Használd numerikus csak akkor, ha a két érték közötti távolság jelentős.
Az alábbi blokk bemutatja a leggyorsabb módszereket annak ellenőrzésére, hogy mi is van valójában.
# Ask R what each column of a data frame actually is sapply(mtcars, class) # Direct membership tests is.factor(factor_day) is.ordered(factor_day) # unclass() exposes the integer codes hiding behind the labels unclass(factor_color)
Két szokás teszi lehetővé a választás őszinteségét. Minden importálás után futtasd le az apply(df, class) függvényt, mert egyetlen elszórt karakter egy numerikus oszlopban az egész oszlopot szöveggé alakítja. És a lehető legkésőbb, az adatok tisztítása és összekapcsolása után konvertáld faktorrá, hogy dplyr Az illesztések és szűrők továbbra is sima karakterláncokat hasonlítanak össze a nem egyező szinthalmazok helyett.

