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.

  • 🏷️ Szerkezet: Egy faktor egész kódokat és egy levels attribútumot tartalmaz, így minden kategória egy fix listához képest érvényesül.
  • 🧩 Teremtés: A factor() függvény egy karaktervektort konvertál, a class() pedig megerősíti az eredmény karakterről faktorra történő változását.
  • 🔘 Névleges: Levels argumentum nélkül az R maga rendezi a kategóriákat, így nem következik a színek vagy nemek közötti rangsorolás.
  • 📊 Sorrendi: Az ordered = TRUE átadása egy explicit szintvektorral rögzíti a rangsorolást a legalacsonyabbtól a legmagasabbig.
  • 🔢 folyamatos: A numerikus és egész oszlopok alapértelmezés szerint folytonosak maradnak, ahogy azt a class(mtcars$mpg) is mutatja.
  • ⚠️ Konverziós csapda: Egy faktor as.numeric() függvénye visszaadja a szintkódokat, ezért először a levels() függvényen keresztül olvassuk be a címkét.
  • 🧠 Karbantartás: A relevel() beállítja a modell alapvonalát, a droplevels() pedig törli a részhalmaz által hátrahagyott kategóriákat.

R kategorikus változó és folytonos változók figyelembevétele

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.

GYIK

Ha a levels argumentum nincs megadva, a factor() meghívja a unique() függvényt, és növekvő sorrendbe rendezi az értékeket. Ez a rendezés az aktív területi beállítástól függ, tehát nem mindig egyszerű ASCII. A levels argumentumot explicit módon kell megadni, amikor az order jelentéssel bír.

A table(f) függvény minden szinthez egy elnevezett darabszámot ad vissza, a prop.table(table(f) függvény pedig ezeket a darabszámokat arányokká alakítja. Mindkettő láthatóvá teszi az üres szinteket, ami hasznossá teszi őket a szűrés után eltűnt kategóriák észleléséhez. adatkeret.

A factor() függvény minden elemet a megadott szintekkel illeszt össze, és minden olyan érték, amelyhez nem illeszkedik, NA-vá válik, ahelyett, hogy hibát jelezne. Konvertálás előtt ellenőrizd a setdiff(unique(x), your_levels) függvényt, és figyelj az elszórt szóközökre vagy az eltérő nagybetűs írásmódra a forrásadatokban.

A cut() egy numerikus vektort oszt szét a megadott töréspontoknál, és egy faktort ad vissza. Átadja az olvasható sávnevekhez tartozó címkéket, és az ordered_result = TRUE értéket, ha a sávok rangsorolódnak. A findInterval() egy gyorsabb alternatíva, ha csak a bin indexre van szükség.

Az R 4.0.0 óta a data.frame() és read.csv() gyári alapértelmezett értéke stringsAsFactors = FALSE, így a szöveges oszlopok karakterek maradnak. A régebbi, automatikus konverzióra támaszkodó szkripteknek mostantól explicit módon kell meghívniuk a factor() függvényt a modellezett oszlopokra.

Less mint régen. Az alap R referencia megjegyzi, hogy az azonos karakterláncok most már megosztják a tárhelyet, így a különbség a legtöbb esetben kicsi. A faktorok továbbra is kifizetődőek a kategóriák validálásával és a modellekben és diagramokban használt szintsorrend rögzítésével.

A legtöbb modellező függvény közvetlenül elfogadja a tényezőket, és automatikusan létrehozza a fiktív kontrasztokat, míg sok gépi tanulás A csomagok egy numerikus mátrixot várnak. A model.matrix() vagy az egyszeri kódolás áthidalja a szakadékot, és egy rendezett faktor megtarthatja a rangsorolását.

Igen. GitHub másodpilóta Működik az RStudio 2023.09.0-s és újabb verzióiban, és a megnyitott fájlban található megjegyzések és kód alapján javasol kiegészítéseket. A szintsorrendet és az NA kezelést ellenőrzési javaslatként, ne tényként kezelje.

Foglald össze ezt a bejegyzést a következőképpen: