Tegur R: Kategoorilised muutujad ja pidevad muutujad
⚡ Nutikas kokkuvõte
R-i funktsioon Factor salvestab kategoorilisi andmeid täisarvukoodide vektorina, mis on seotud tasemete komplektiga – nii eraldab keel piiratud kategooriate rühma pidevast mõõtmisest.

Mis on R-i tegur?
Tegur R-s on muutuja, mida kasutatakse andmete kategoriseerimiseks ja salvestamiseks ning millel on piiratud arv erinevaid väärtusi. See salvestab andmeid täisarvude väärtuste vektorina. Faktor R-is on tuntud ka kui kategooriline muutuja, mis salvestab nii string- kui ka täisarvude väärtusi tasemetena. Faktorit kasutatakse enamasti statistilises modelleerimises ja uurimuslikus andmeanalüüsis R-is.
Sisemiselt on tegur kaks koos liikuvat objekti: täisarvuline koodide vektor ja märgiatribuut nimega tasetIga kood on selles tasemevektoris positsioon, mistõttu teguri printimine näitab sõnu, samal ajal kui klassist eemaldamine() näitab numbreid.
Andmekogus saame eristada kahte tüüpi muutujaid: kategooriline ja pidev.
- R-i kategooriliste muutujate kirjeldavas statistikas on väärtus piiratud ja põhineb tavaliselt konkreetsel piiratud rühmal. Näiteks võib R-i kategooriliseks muutujaks olla riigid, aasta, sugu, amet.
- Pidev muutuja võib aga võtta mis tahes väärtused täisarvust kümnendmurruni. Näiteks võib meil olla tulu, aktsia hind jne.
Seda eristust tasub meeles pidada, sest R valib vaikselt iga veeru jaoks erinevad vaikesätted. Numbriline veerg summeeritakse keskmise ja mediaaniga, samas kui tegur summeeritakse tasemete arvuga. Kategooria tekstina või numbrina salvestamine muudab seega saadavat analüüsi. Laiem valik salvestusrežiime on käsitletud juhendis R-andmetüübid ja operaatorid.
Kategoorilised muutujad
Kategoorilised muutujad sisse R salvestatakse faktorisse. Vaatame allolevat koodi, et teisendada R-is märkmuutuja faktorimuutujaks. Paljud modelleerimis- ja masinõpperutiinid ei saa toorteksti kasutada, seega tuleb kategooriad enne mudeli sobitamist kodeerida tasemete või numbritena.
Süntaks
factor(x = character(), levels, labels = levels, ordered = is.ordered(x))
R-i baasviide dokumenteerib veel kaks argumenti, mis ülaltoodud lühendatud vormis puuduvad: välistama, mis eemaldab väärtused enne tasemekomplekti loomist ja nmax, tasemete arvu ülempiir, mis kiirendab väga suurte vektorite teisendamist.
Argumendid:
- xR-i kategooriliste andmete vektor. Peab olema string või täisarv, mitte kümnendmurr.
- taset: Võimalike väärtuste vektor, mille võtab x. See argument on valikuline. Vaikimisi väärtus on vektori x elementide unikaalne loend, mis on sorteeritud kasvavas järjekorras.
- sildidLisage R-i x kategoorilisele andmele silt. Näiteks 1 saab sildi „mees“ ja 0 silt „naine“.
- välistamaVäärtuste vektor, mis tasemekomplekti moodustamisel eemaldatakse. Välja jäetud väärtused muutuvad tulemuses puuduvateks.
- tellitudLoogiline lipp, mis määrab, kas tasemeid tuleks käsitleda antud järjekorras järjestatud olevat.
- nmaxValikuline ülempiir tasemete arvule, kasulik pikkade vektorite puhul.
Näide:
Teisendame märgivektori faktoriks ja kinnitame muutust class() abil.
# 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)
Väljund:
## [1] "character" ## [1] "factor"
Klass lülitus märgilt tegurile ja prinditud väärtuste osas ei muutunud midagi. Oluline on teisendada a nöör R-i faktorimuutujaks enne masinõppeülesannet, sest just sel hetkel muutuvad kategooriad fikseeritud ja valideeritud hulgaks.
Kategoorilise muutuja R-s võib jagada nominaalne kategooriline muutuja ja järguline kategooriline muutuja.
Nominaalne kategooriline muutuja
Nominaalsel kategoorilisel muutujal on mitu väärtust, kuid järjekord pole oluline. Näiteks mees või naine. R-i nominaalsed kategoorilised muutujad ei kanna mingit järjestust.
# 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
Väljund:
## [1] blue red green white black yellow ## Levels: black blue green red white yellow
Värvifaktori (factor_color) põhjal ei saa me järjestust kindlaks teha. Tasemete loend on tähestikulises järjekorras, kuna levels argumenti ei antud, seega sorteeris R unikaalsed väärtused ise. See sortimine järgib aktiivset lokaati, mitte tavalist ASCII-koodi, mis on üks põhjus tasemete selgesõnaliseks märkimiseks alati, kui järjestus on oluline.
Ordinaal Kategooriline muutuja
Ordinaalsetel kategoorilistel muutujatel on loomulik järjestus. Järjestus tuleneb vektori järjestusest, mis edastatakse muutujale. taset argument ja järjestatud = TRUE annab R-ile käsu käsitleda seda järjestust paremusjärjestuse, mitte tühja loendina. Paigutus järjestatud = FALSE ei pööra järjestust ümber; see lihtsalt loob tavalise järjestamata teguri. Kõrgeimast madalaimani järjestamiseks tuleb tasemete vektor ise ümber pöörata.
Näide:
R-i iga tegurimuutuja väärtuste loendamiseks saame kasutada kokkuvõtet.
# 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
Väljund:
## [1] evening morning afternoon midday
midnight evening
Konsool prindib esmalt väärtused ja nende alla paremusjärjestuse. Järgmine plokk avaneb selle Levels reaga, mis on endiselt kommenteeritud, seega jääb paremusjärjestus nähtavaks, kuni summary() kutse eelmisele koodile lisatakse.
## Levels: morning < midday < afternoon < evening < midnight # Append the line to above code # Count the number of occurence of each level summary(factor_day)
Väljund:
## morning midday afternoon evening midnight ## 1 1 1 2 1
R järjestas taseme 'hommikust' 'keskööni', nagu on täpsustatud levels argumendis. Kuna tegur on järjestatud, toimivad sellega ka võrdlusoperaatorid, näiteks < ja >, mida nad ülaltoodud nominaalse värviteguri puhul ei tee.
Pidevad muutujad
Pideva klassi muutujad on R-is vaikeväärtused. Neid salvestatakse numbriliste või täisarvudena. Seda näeme allolevast andmestikust. mtcars on sisseehitatud andmestik. See kogub teavet erinevat tüüpi autode kohta. Saame selle mtcarsi abil importida ja kontrollida muutuja mpg (miil galloni kohta) klassi. See tagastab numbrilise väärtuse, mis näitab pidevat muutujat.
dataset <- mtcars class(dataset$mpg)
Väljund
## [1] "numeric"
Mitte iga numbriline veerg pole tõeliselt pidev. Samas andmestikus sisaldab cyl ainult väärtusi 4, 6 ja 8 ning am ainult väärtusi 0 ja 1, seega on mõlemad kategooriad, mis on salvestatud arvudena. Nende teisendamine funktsiooniga factor() enne modelleerimist takistab R-il käsitlemast 4 ja 6 silindri vahelist tühimikku mõõdetud suurusena. Vastupidine samm, pideva veeru lõikamine ribadeks, teostatakse funktsiooniga cut().
Faktoritasemed ja sildid R-is
Atribuut „levels“ on teguri osa, mille muutmisele kulutate kõige rohkem aega, kuna see kontrollib nii seda, mis prinditakse, kui ka seda, mida mudel baasjoonena käsitleb. Neli baas-R abimeest katavad peaaegu iga juhtumi.
| funktsioon | Mida see teeb | Tüüpiline kasutamine |
|---|---|---|
| tasemed (f) | Loeb või asendab tasemete nimesid | Lühendite ümbernimetamine loetavateks siltideks |
| nlevels(f) | Tagastab tasemete arvu | Kategooria kontrollimine ei plahvatanud pärast liitumist |
| uuesti level(f, ref) | Liigub ühe taseme võrra ettepoole | Regressiooni baasjoone valimine |
| droplevels(f) | Eemaldab tasemed, millel pole vaatlusi | Puhastamine pärast alamhulga lisamist või filtreerimist |
Allolev plokk rakendab kõiki nelja varem loodud värvi- ja sooteguritele.
# 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])
Tasub meeles pidada kahte detaili. Funktsioonile levels() omistamine nimetab ümber positsiooni järgi, seega mittevastav vektor nimetab vaikselt ümber vale kategooria. Ja alamhulk hoiab iga algset taset kuni droplevels() kutsumiseni, mistõttu filtreeritud... andmeraam saab ikka tühje tulpasid joonistada. sildid Argument on jälle erinev: see nimetab tasemed loomise ajal ja dubleeritud sildid ühendavad mitu sisendväärtust üheks tasemeks.
Kuidas teisendada tegurit numbriliseks või märgiks R-is
See on R-i kõige levinum faktori viga. Kuna faktoris salvestatakse täisarvukoode, tagastab as.numeric() kutsumine need koodid, mitte ekraanil kuvatavad väärtused. Aastate 2021 kuni 2023 faktori väärtused on 1, 2 ja 3.
# 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)
R-i baasdokumentatsioon soovitab õige ja veidi kiirema marsruudina as.numeric(levels(f))[f], kus hõlpsamini loetava vastena on as.numeric(as.character(f)). Mõlemad loevad esmalt sildi ja teisendavad seejärel.
- Tegur iseloomule: as.character(f) tagastab sildid lihttekstina.
- Täisarvulisteks faktoriteks koodid: as.integer(f) või unclass(f), kui koodid on just sellised, nagu sa vajad.
- Tegelane, keda arvestada: factor(x) või kiirem otsetee as.factor(x).
- Numbriline tegurdamiseks: factor(x) diskreetsete koodide jaoks, cut(x, breaks) pidevate väärtuste jaoks, mis vajavad ribastamist.
Üks kaitsemeede kehtib neile kõigile. Kui x väärtus tasemete vektoris ei esine, määrab factor() selle elemendi väärtuseks NA, selle asemel et viga tekitada, seega võib hulkuv tühik või suurtähtede erinevus märkamatult ridu kustutada. Unikaalsete väärtuste võrdlemine enne ja pärast teisendamist või andmeraami sorteerimine uuel veerul paljastab probleemi kiiresti.
Faktor vs märk vs numbriline R-is: millal igaüht kasutada
Salvestusrežiimi varajane valimine säästab hilisemat silumist suurel hulgal. Tabelis võrreldakse kolme režiimi, mida teksti- või koodiveerud saavad kasutada.
| vara | Faktor | Iseloom | Arv- |
|---|---|---|---|
| Salvestatud kui | Täisarvukoodid pluss levels atribuut | Keelpillid | Doubles või täisarvud |
| Fikseeritud väärtuste kogum | Jah, tasemete kaupa määratletud | Ei | Ei |
| Kohandatud kuvamisjärjekord | Jah, läbi tasemete | Ainult tähestikulises järjekorras | Ainult numbriline |
| Aritmeetika | Ei ole lubatud | Ei ole lubatud | lubatud |
| Mudeli kontrastid | Ehitatud automaatselt | Esmalt sunniti | Mõõtmisena käsitletud |
Kasutama faktor kui väärtused pärinevad teadaolevast suletud loendist, kui kuvamis- või järjestusjärjekord on oluline või kui veerg annab teavet mudeli või graafiku legendi kohta. Kasutage. iseloom vaba teksti, identifikaatorite ja kõige muu jaoks, mida parsite või mille alusel ühendate, näiteks nimed, märkmed ja koodid, mis saabuvad pidevalt uute väärtustega. Kasutage arv- ainult siis, kui kahe väärtuse vaheline kaugus on oluline.
Allolev plokk näitab kiireimaid viise, kuidas kontrollida, mis teil tegelikult on.
# 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)
Valiku õigsuse tagavad kaks harjumust. Käivita pärast iga importi sapply(df, class), sest üksainus ekslik märk numbrilises veerus muudab kogu veeru tekstiks. Ja teisenda teguriks nii hilja kui võimalik, pärast andmete puhastamist ja ühendamist, nii et dplyr Liitmised ja filtrid võrdlevad endiselt tavalisi stringe, mitte mittevastavaid tasemekomplekte.
