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.

  • ???? ️ Struktuur: Faktor sisaldab täisarvukoode ja levels atribuuti, seega iga kategooria valideeritakse fikseeritud loendi suhtes.
  • 🧩 Loomine: factor() teisendab märgivektori ja class() kinnitab tulemuse muutumist märgilt faktorile.
  • 🔘 Nominaalne: Ilma levels argumendita sorteerib R kategooriad ise, seega ei kaasne värvide ega sugude vahelist järjestust.
  • 📊 Korduv: Kui edastada ordered = TRUE koos selgesõnalise tasemevektoriga, fikseeritakse järjestus madalaimast kõrgeimani.
  • 🔢 Pidev: Numbrilised ja täisarvulised veerud jäävad vaikimisi pidevaks, nagu näitab klass (mtcars$mpg).
  • ⚠️ Konversioonilõks: Funktsioon as.numeric() tagastab faktori puhul tasemekoodid, seega loe esmalt läbi levels() funktsiooni silt.
  • 🧠 Hooldamine: relevel() määrab mudeli baasjoone ja droplevels() tühjendab alamhulgast maha jäänud kategooriad.

Tegur R-kategooria muutujates ja pidevates muutujates

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.

KKK

Kui levels'i ei anta, kutsub factor() funktsiooni unique() ja sorteerib väärtused kasvavas järjekorras. See sortimine sõltub aktiivsest lokaadist, seega pole see alati puhas ASCII. Esitage levels argument selgesõnaliselt alati, kui järjekorras on tähendus.

table(f) tagastab iga taseme kohta nimetatud loenduri ja prop.table(table(f)) teisendab need loendurid proportsioonideks. Mõlemad hoiavad tühjad tasemed nähtavana, mis teeb need kasulikuks pärast filtreerimist kadunud kategooriate märkamiseks. andmeraam.

factor() leiab iga elemendi vaste teie sisestatud tasemetele ja iga väärtus, millel vastet pole, muutub NA-ks, selle asemel et tekitada viga. Enne teisendamist kontrollige funktsiooni setdiff(unique(x), your_levels) ja jälgige, kas lähteandmetes on juhuslikke tühikuid või erinevat suurtähtede kasutust.

cut() jagab numbrilise vektori antud murdepunktides ja tagastab teguri. Edastage loetavate ribade nimede sildid ja ordered_result = TRUE, kui ribad on järjestatud. findInterval() on kiirem alternatiiv, kui on vaja ainult prügikasti indeksit.

Alates versioonist R 4.0.0 on data.frame() ja read.csv() funktsioonide tehase vaikeväärtus stringsAsFactors = FALSE, seega tekstiveerud jäävad tähemärkideks. Vanemad skriptid, mis tuginesid automaatsele teisendamisele, peavad nüüd factor() funktsiooni modelleeritavate veergude jaoks selgesõnaliselt kutsuma.

Less kui varem. R-i baasviide märgib, et identsed stringid jagavad nüüd salvestusruumi, seega on vahe enamasti väike. Faktorid tasuvad end endiselt ära kategooriate valideerimise ja mudelites ning graafikutes kasutatava tasemete järjekorra fikseerimise kaudu.

Enamik modelleerimisfunktsioone aktsepteerib tegureid otse ja loob automaatselt näivkontraste, samas kui paljud masinõpe Paketid ootavad numbrilist maatriksit. model.matrix() või ühekordne kodeering täidab selle tühimiku ning järjestatud tegur saab oma järjestust säilitada.

Jah. GitHubi koopia Töötab RStudio 2023.09.0 ja uuemates versioonides ning pakub välja täiendusi avatud faili kommentaaride ja koodi põhjal. Käsitle tasemete järjekorda ja NA käsitlemist kontrollimiseks mõeldud soovitustena, mitte faktidena.

Võta see postitus kokku järgmiselt: