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.

  • 🏷️ Struktura: Faktor sadrži cjelobrojne kodove plus atribut razina, tako da se svaka kategorija validira u odnosu na fiksni popis.
  • 🧩 Stvaranje: factor() pretvara vektor znakova, a class() potvrđuje promjenu rezultata iz znaka u faktor.
  • 🔘 Nominalni: Bez argumenta levels, R sam sortira kategorije, tako da se ne podrazumijeva rangiranje između boja ili spolova.
  • 📊 Redni: Dodavanje ordered = TRUE s eksplicitnim vektorom razina fiksira rangiranje od najnižeg do najvišeg.
  • 🔢 Kontinuirano: Numerički i cjelobrojni stupci ostaju kontinuirani prema zadanim postavkama, kao što pokazuje class(mtcars$mpg).
  • ⚠️ Zamka za konverziju: as.numeric() na faktoru vraća kodove razina, pa prvo pročitajte oznaku pomoću levels().
  • 🧠 Održavanje: relevel() postavlja osnovnu liniju modela, a droplevels() briše kategorije koje je ostavio podskup.

Faktoriziranje kategoričke varijable i kontinuiranih varijabli u R

Š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.

Pitanja i odgovori

Kada argument levels nije naveden, factor() poziva unique() i sortira vrijednosti u rastućem redoslijedu. To sortiranje ovisi o aktivnoj lokalizaciji, tako da nije uvijek čisto ASCII. Navedite argument levels eksplicitno kad god redoslijed ima značenje.

table(f) vraća imenovani broj za svaku razinu, a prop.table(table(f)) pretvara te brojeve u proporcije. Obje funkcije drže prazne razine vidljivima, što ih čini korisnima za uočavanje kategorija koje su nestale nakon filtriranja podatkovni okvir.

factor() uspoređuje svaki element s razinama koje ste naveli, a svaka vrijednost bez podudaranja postaje NA umjesto da se pojavi greška. Provjerite setdiff(unique(x), your_levels) prije pretvorbe i pripazite na zalutale razmake ili različita velika slova u izvornim podacima.

cut() dijeli numerički vektor na točkama prekida koje zadaste i vraća faktor. Proslijedite oznake za čitljive nazive pojaseva i ordered_result = TRUE kada su pojasevi rangirani. findInterval() je brža alternativa kada je potreban samo indeks bina.

Od verzije R 4.0.0, tvornički zadana vrijednost za data.frame() i read.csv() je stringsAsFactors = FALSE, pa tekstualni stupci ostaju znakovni. Stariji skripti koji su se oslanjali na automatsku pretvorbu sada moraju eksplicitno pozivati ​​factor() na stupcima koje modeliraju.

Less nego što su to nekad činili. U osnovnoj R referenci navodi se da identični nizovi sada dijele pohranu, pa je jaz u većini slučajeva mali. Faktori se i dalje isplate validacijom kategorija i popravljanjem redoslijeda razina koji se koristi u modelima i grafikonima.

Većina funkcija modeliranja izravno prihvaća faktore i automatski izgrađuje lažne kontraste, dok mnoge stroj za učenje Paketi očekuju numeričku matricu. model.matrix() ili one-hot kodiranje premošćuje jaz, a uređeni faktor može zadržati svoj rang.

Da. GitHub kopilot Radi u RStudio 2023.09.0 i novijim verzijama te predlaže dovršetke iz komentara i koda u otvorenoj datoteci. Tretirajte redoslijed razina i rukovanje NA kao prijedloge za provjeru, a ne kao činjenice.

Sažmite ovu objavu uz: