Faktor u R: kategoričke varijable & kontinuirane varijable
⚡ Pametni sažetak
Faktor u R-u pohranjuje kategoričke podatke kao vektor cjelobrojnih kodova uparenih sa skupom razina, što je način na koji jezik odvaja ograničenu skupinu kategorija od kontinuiranog mjerenja.

Što je faktor u R?
Faktor u R je varijabla koja se koristi za kategorizaciju i pohranu podataka, s ograničenim brojem različitih vrijednosti. Pohranjuje podatke kao vektor cjelobrojnih vrijednosti. Faktor u R-u je također poznat kao kategorička varijabla koja pohranjuje i nizove i cjelobrojne vrijednosti podataka kao razine. Faktor se uglavnom koristi u statističkom modeliranju i istraživačkoj analizi podataka s R-om.
Interno, faktor su dva objekta koja putuju zajedno: cjelobrojni vektor kodova i atribut znaka nazvan razinaSvaki kod je pozicija u tom vektoru razina, zbog čega ispis faktora prikazuje riječi dok unclass() prikazuje brojeve.
U skupu podataka možemo razlikovati dvije vrste varijabli: kategoričan i stalan.
- U deskriptivnoj statistici za kategoričke varijable u R, vrijednost je ograničena i obično se temelji na određenoj konačnoj grupi. Na primjer, kategorička varijabla u R može biti zemlje, godina, spol, zanimanje.
- Međutim, kontinuirana varijabla može poprimiti bilo koje vrijednosti, od cijelog broja do decimalnog broja. Na primjer, možemo imati prihod, cijenu dionice itd.
Tu razliku vrijedi čuvati jer R tiho odabire različite zadane vrijednosti za svaki. Numerički stupac sažima se sa srednjom vrijednošću i medijanom, dok se faktor sažima s brojevima po razini. Pohranjivanje kategorije kao teksta ili kao broja stoga mijenja analizu koju dobivate. Širi skup načina pohranjivanja obuhvaćen je u vodiču za R tipovi podataka i operatori.
Kategoričke varijable
Kategorijalne varijable u R pohranjuju se u faktor. Provjerimo donji kod kako bismo pretvorili znakovnu varijablu u varijablu faktora u R-u. Mnoge rutine modeliranja i strojnog učenja ne mogu konzumirati sirovi tekst, pa kategorije moraju biti kodirane kao razine ili kao brojevi prije nego što se model prilagodi.
Sintaksa
factor(x = character(), levels, labels = levels, ordered = is.ordered(x))
Osnovna R referenca dokumentira dva dodatna argumenta koja skraćeni oblik iznad izostavlja: isključiti, što uklanja vrijednosti prije nego što se izgradi skup razina, i nmax, gornja granica broja razina koja ubrzava pretvorbu vrlo velikih vektora.
argumenti:
- xVektor kategoričkih podataka u R-u. Mora biti niz znakova ili cijeli broj, ne decimalni.
- razinaVektor mogućih vrijednosti koje x uzima. Ovaj argument nije obavezan. Zadana vrijednost je jedinstveni popis elemenata vektora x, sortiranih u rastućem redoslijedu.
- OznakeDodajte oznaku kategoričkim podacima x u R. Na primjer, 1 može uzeti oznaku muško, dok 0 može uzeti oznaku žensko.
- isključitiVektor vrijednosti koje treba ukloniti kada se formira skup razina. Isključene vrijednosti postaju NA u rezultatu.
- naredioLogička zastavica koja određuje treba li razine smatrati uređenima, prema zadanom redoslijedu.
- nmax: Opcionalna gornja granica broja razina, korisna za duge vektore.
Primjer:
Pretvorimo vektor znakova u faktor i potvrdimo promjenu pomoću class().
# 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)
Izlaz:
## [1] "character" ## [1] "factor"
Klasa se prebacila sa znaka na faktor, a ništa u vezi s ispisanim vrijednostima se nije promijenilo. Važno je transformirati niz u faktorsku varijablu u R-u prije zadatka strojnog učenja, jer je to točka u kojoj kategorije postaju fiksni, validirani skup.
Kategorička varijabla u R može se podijeliti na nominalna kategorička varijabla i redna kategorička varijabla.
Nominalna kategorička varijabla
Nominalna kategorička varijabla ima nekoliko vrijednosti, ali redoslijed nije važan. Na primjer, muško ili žensko. Nominalne kategoričke varijable u R-u nemaju nikakav redoslijed.
# 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
Izlaz:
## [1] blue red green white black yellow ## Levels: black blue green red white yellow
Iz factor_color ne možemo odrediti nikakav redoslijed. Popis razina je abecedni samo zato što nije naveden argument levels, pa je R sam sortirao jedinstvene vrijednosti. To sortiranje slijedi aktivnu lokalizaciju, a ne obični ASCII, što je jedan od razloga za eksplicitno navođenje razina kad god je redoslijed važan.
Redna kategorička varijabla
Ordinalne kategoričke varijable imaju prirodni poredak. Rangiranje dolazi od redoslijeda vektora koji se prosljeđuje razina argument, a ordered = TRUE govori R-u da tretira taj niz kao rangiranje, a ne kao goli popis. Postavljanje ordered = FALSE ne obrće rangiranje; jednostavno proizvodi običan neuređeni faktor. Za rangiranje od najvišeg do najnižeg, obrnite sam vektor razina.
Primjer:
Možemo koristiti sažetak za brojanje vrijednosti za svaku faktorsku varijablu u R.
# 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
Izlaz:
## [1] evening morning afternoon midday
midnight evening
Konzola prvo ispisuje vrijednosti, a ispod njih rang. Sljedeći blok se otvara s tim retkom Levels, koji je još uvijek komentiran, tako da rang ostaje vidljiv dok se poziv summary() dodaje prethodnom kodu.
## Levels: morning < midday < afternoon < evening < midnight # Append the line to above code # Count the number of occurence of each level summary(factor_day)
Izlaz:
## morning midday afternoon evening midnight ## 1 1 1 2 1
R je poredao razinu od 'jutra' do 'ponoći' kako je navedeno u argumentu levels. Budući da je faktor uređen, operatori usporedbe poput < i > također rade na njemu, što ne rade na nominalnom faktoru boje iznad.
Kontinuirane varijable
Kontinuirane varijable klase su zadana vrijednost u R-u. Pohranjuju se kao numerički ili cijeli brojevi. To možemo vidjeti iz skupa podataka u nastavku. mtcars je ugrađeni skup podataka. Prikuplja informacije o različitim vrstama automobila. Možemo ga uvesti pomoću mtcars i provjeriti klasu varijable mpg, milja po galonu. Vraća numeričku vrijednost, što ukazuje na kontinuiranu varijablu.
dataset <- mtcars class(dataset$mpg)
Izlaz
## [1] "numeric"
Nije svaki numerički stupac istinski kontinuiran. U istom skupu podataka, cyl sadrži samo 4, 6 i 8, a am sadrži samo 0 i 1, tako da su obje kategorije pohranjene kao brojevi. Pretvaranjem pomoću factor() prije modeliranja sprječava se da R tretira razmak između 4 i 6 cilindara kao izmjerenu količinu. Obrnuti potez, rezanje kontinuiranog stupca na trake, obavlja se pomoću cut().
Razine faktora i oznake u R-u
Atribut levels je dio faktora na koji ćete potrošiti najviše vremena prilikom podešavanja, jer kontrolira i što se ispisuje i što model tretira kao osnovnu liniju. Četiri osnovna R pomoćnika pokrivaju gotovo svaki slučaj.
| funkcija | Ono što se također | Tipična upotreba |
|---|---|---|
| razine(f) | Čita ili zamjenjuje nazive razina | Preimenovanje kratica u čitljive oznake |
| nlevels(f) | Vraća broj razina | Provjera kategorije nije se raspršila nakon spajanja |
| ponovno izjednačavanje(f, ref) | Pomiče se za jednu razinu naprijed | Odabir osnovne linije za regresiju |
| droplevels(f) | Uklanja razine s nula opažanja | Čišćenje nakon podskupljavanja ili filtriranja |
Donji blok primjenjuje sva četiri na faktore boje i spola koji su ranije stvoreni.
# 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])
Vrijedi zapamtiti dva detalja. Dodjeljivanje levels() preimenuje po poziciji, pa neusklađeni vektor tiho preimenuje pogrešnu kategoriju. A podskup zadržava svaku originalnu razinu dok se ne pozove droplevels(), zbog čega filtrirani podatkovni okvir još uvijek može iscrtati prazne stupce. Oznake Argument je opet drugačiji: imenuje razine u trenutku stvaranja, a duplicirane oznake spajaju nekoliko ulaznih vrijednosti u jednu razinu.
Kako pretvoriti faktor u broj ili znak u R-u
Ovo je najčešća pojedinačna greška faktora u R-u. Budući da faktor pohranjuje cjelobrojne kodove, pozivanje funkcije as.numeric() vraća te kodove, a ne vrijednosti koje možete vidjeti na ekranu. Faktor za godine od 2021. do 2023. vraća se kao 1, 2 i 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)
Osnovna R dokumentacija preporučuje as.numeric(levels(f))[f] kao ispravan i nešto brži put, s as.numeric(as.character(f)) kao lakšim za čitanje ekvivalentom. Oba prvo čitaju oznaku, a zatim pretvaraju.
- Faktor za karakter: as.character(f) vraća oznake kao običan tekst.
- Faktoriziranje u cjelobrojne kodove: as.integer(f) ili unclass(f) kada su kodovi ono što zapravo želite.
- Znak za faktorizaciju: factor(x) ili brža kratica as.factor(x).
- Numerički faktor: faktor(x) za diskretne kodove, rez(x, prekidi) za kontinuirane vrijednosti koje zahtijevaju pojaseve.
Jedna zaštita primjenjuje se na sve njih. Ako se vrijednost u x ne pojavljuje u vektoru razina, factor() postavlja taj element na NA umjesto da izazove grešku, tako da zalutali razmak ili razlika u velikim slovima mogu tiho izbrisati retke. Uspoređivanje jedinstvenih vrijednosti prije i poslije pretvorbe, ili sortiranje okvira podataka u novom stupcu brzo otkriva problem.
Faktor vs. znak vs. broj u R-u: Kada koristiti svaki
Rani odabir načina pohrane štedi mnogo kasnijeg otklanjanja pogrešaka. Tablica uspoređuje tri načina koje stupac teksta ili kodova može imati.
| Svojstvo | Faktor | Lik | Numerički |
|---|---|---|---|
| Pohranjeno kao | Cjelobrojni kodovi plus atribut razina | Strings | Doubles ili cijeli brojevi |
| Fiksni skup vrijednosti | Da, definirano razinama | Ne | Ne |
| Prilagođeni redoslijed prikaza | Da, kroz razine | Samo abecedno | Samo numerički |
| Aritmetika | Nije dozvoljeno | Nije dozvoljeno | dopušteno |
| Kontrasti modela | Automatski izgrađeno | Prvo prisiljen | Tretira se kao mjerenje |
Koristiti faktor kada vrijednosti dolaze s poznatog, zatvorenog popisa, kada je redoslijed prikaza ili rangiranja važan ili kada stupac unosi podatke u model ili legendu grafikona. Koristite lik za slobodni tekst, identifikatore i sve što ćete analizirati ili spajati, kao što su imena, bilješke i kodovi koji stalno pristižu s novim vrijednostima. Koristite numerički samo kada je udaljenost između dvije vrijednosti značajna.
Donji blok prikazuje najbrže načine za provjeru što zapravo imate.
# 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)
Dvije navike održavaju izbor poštenim. Pokreni sapply(df, class) nakon svakog uvoza, jer jedan zalutali znak u numeričkom stupcu pretvara cijeli stupac u tekst. I pretvori u faktor što je kasnije moguće, nakon što su podaci očišćeni i spojeni, tako da dplyr Spojevi i filteri i dalje uspoređuju obične nizove, a ne neusklađene skupove razina.
