2.2_fattori

Strutture Dati

  • vettori

  • fattori

  • liste

  • matrici

  • array

  • dataframe

Fattori

I fattori sono una tipologia di dato peculiare e per quanto simile a semplici characters in realtà sono un tipo di vettore integer con delle proprietà aggiuntive.

Creare un fattore

I fattori si possono creare sia convertendo un vettore character attraverso il comando as.factor() che creando esplicitamente un fattore attraverso il comando factor()

char_vect = rep(c("hello","ciao", "hola"), each = 2)
as.factor(char_vect)
[1] hello hello ciao  ciao  hola  hola 
Levels: ciao hello hola
my_fact = factor(char_vect)
my_fact
[1] hello hello ciao  ciao  hola  hola 
Levels: ciao hello hola

Caratteristiche dei fattori

In pratica assegnano un’etichetta ad un valore numerico intero:

typeof(my_fact)
[1] "integer"
as.integer(my_fact); my_fact
[1] 2 2 1 1 3 3
[1] hello hello ciao  ciao  hola  hola 
Levels: ciao hello hola

Questo non vale per i vettori character!

as.integer(char_vect)
[1] NA NA NA NA NA NA

I fattori permettono di avere dei livelli levels() come metadati, a prescindere da quali siano effettivamente presenti nel vettore

levels(my_fact)
[1] "ciao"  "hello" "hola" 
my_fact2 = my_fact[my_fact!="ciao"]
my_fact2
[1] hello hello hola  hola 
Levels: ciao hello hola

E’ possibile però eslcudere i livelli non più utili attraverso il comando droplevels()

droplevels(my_fact2) 
[1] hello hello hola  hola 
Levels: hello hola

E’ possibile anche rinominare i livelli del fattore

# il fattore che ho creato 
my_fact
[1] hello hello ciao  ciao  hola  hola 
Levels: ciao hello hola
# creo un altro fattore "my_fact_lev" identico a "my_fact"
my_fact_lev = my_fact
my_fact_lev == my_fact
[1] TRUE TRUE TRUE TRUE TRUE TRUE
# rinomino i livelli del fattore
levels(my_fact_lev) = c("italiano","inglese","spagnolo")

my_fact_lev
[1] inglese  inglese  italiano italiano spagnolo spagnolo
Levels: italiano inglese spagnolo
my_fact
[1] hello hello ciao  ciao  hola  hola 
Levels: ciao hello hola

E’ possibile sia riordinare che rinominare i livelli di un fattore attraverso la funzione factor()

my_fact
[1] hello hello ciao  ciao  hola  hola 
Levels: ciao hello hola
# di default l'ordine di assegnazione è alfabetico 
as.integer(my_fact)
[1] 2 2 1 1 3 3
new_fact = factor(my_fact, levels = c("hello","ciao","hola"))
new_fact
[1] hello hello ciao  ciao  hola  hola 
Levels: hello ciao hola
as.integer(new_fact)
[1] 1 1 2 2 3 3
new_fact2 = factor(my_fact, levels = c("hello","ciao","hola"),
                   labels = c("inglese","italiano","spagnolo"))
new_fact2
[1] inglese  inglese  italiano italiano spagnolo spagnolo
Levels: inglese italiano spagnolo

Ricordate: l’argomento levels dentro la funzione factor() serve a riordinare i livelli del fattore, mentre la funzione levels() li rinomina non riordina!

# il fattore che ho creato 
my_fact
[1] hello hello ciao  ciao  hola  hola 
Levels: ciao hello hola
as.integer(my_fact)
[1] 2 2 1 1 3 3
levels(my_fact) = c("hello","ciao","hola")

# Cosa notate rispetto al vettore my_fact visualizzato sopra?
my_fact
[1] ciao  ciao  hello hello hola  hola 
Levels: hello ciao hola
as.integer(my_fact)
[1] 2 2 1 1 3 3

Fattori Ordinali

Un sottotipo di fattori sono gli ordered factors che corrispondo alle variabili ordinali, ovvero dove i livelli sono ordinati in modo crescente:

my_ord_fac = as.ordered(my_fact)

my_ord_fac # odine alfabetico
[1] ciao  ciao  hello hello hola  hola 
Levels: hello < ciao < hola
attributes(my_ord_fac)
$levels
[1] "hello" "ciao"  "hola" 

$class
[1] "ordered" "factor" 

Facciamo un po’ di pratica!


Aprite e tenete aperto questo link:

https://etherpad.wikimedia.org/p/arca-corsoR