Variables i tipus

Una variable és una característica del fenomen que estudiem que varia entre els casos i, per tant, pot prendre diversos valors. Tenim quatre tipus de variables:

Variables categòriques

Tenim principalment tres tipus de variables categòriques: nominals, ordinals i binàries. Qualsevol d’aquests tres tipus es pot emmagatzemar a R com a vectors de caràcter, factors o vectors lògics. La manera com l’emmagatzamem dependrà de la utilitat que li vulguem donar:

Font: Alison Horst.

Variables categòriques nominals

Les variables categòriques nominals es poden emmagatzemar a R com a vectors de caràcter, com a factors o com a vectors lògics.

Operacions: Amb les variables categòriques nominals es poden fer les següents operacions d’igualtat.
Igual: ==
No igual: !=

Caràcters

Els vectors de caràcter o strings emmagatzemen tot tipus de caràcters, des de lletres fins a símbols especials. Sempre utilitzarem les cometes per a referir-nos a cada valor. Crearem un vector de caràcter de la següent manera:

vector_caracter <- c("Kuwait", "Qatar", "Saudi Arabia", "Bahrain")

Per poder modificar fàcilment els vectors de caràcter, un dels paquets amb més possibilitats és el paquet stringr.

Factors

Un factor és un vector enter que emmagatzema informació categòrica. Normalment crearem els factors a partir d’un vector caràcter i el passarem a factor amb la funció factor()1 de la següent manera:

paisos <- factor(c("BRA", "ARG", "VEN", "URU", "PAR")) #creem un vector de caràcter
paisos #observem el vector
levels(paisos) #mirem els nivells

A continuació veiem com modificar els nivells d’un factor:

#podem modificar els nivells de la següent manera:
levels(paisos) <- c("Argentina", "Brazil", "Paraguay", "Uruguay", "Venezuela") 
paisos #comprovem els resultats

#també podem modificar un sol nivell
levels(paisos)[4] <- c("URUGUAY") 
paisos #comprovem els resultats

#o podem modificar els nivells a través d'un argument a la funció factor
factor(paisos, labels = c("Argentina", "Brazil", "Paraguay", "Uruguay", "Venezuela"))

Per manipular factors és molt útil el paquet forcats.

Lògics

En un vector lògic la variable només pot tenir dos valors discrets i normalment no ordenables: veritat (TRUE) i fals (FALSE). En aquest cas es tractarà d’una variable binària (també dita dicotòmica, booleana o dummy), que normalment serveix per a indicar la presència o absència d’un determinat concepte. Si el concepte és present, la variable prèn el valor lògic TRUE, si el concepte és absent, prèn el valor lògic FALSE. Crearem un vector lògic de la següent manera:

vector_logic <- c(TRUE, FALSE, FALSE, TRUE)

Variables categòriques ordinals

Les variables ordinals són variables categòriques que es poden ordenar de manera lògica. També les podem emmagatzemar com a vectors de caràcter, factors o vectors lògics, encara que amb algunes petites diferències en relació als factors i els vectors lògics.

Operacions: Amb les variables categòriques ordinals es poden fer les següents operacions d’igualtat.
Igual: ==
No igual: !=
Més gran o igual que: >=
Més petit o igual que: <=
Més gran que: >
Més petit que: <

Factors

Els factors són una de les eines principals que tenim per a emmagatzemar variables categòriques. El seu gran potencial és la manera com poden guardar variables ordinals, ja que tenen la capacitat d’ordenar les categories seguint l’ordre que indiquem. Fixeu-vos en el marc de dades que creem, on tenim una variable categòrica ordinal. Un cop creat, imprimim el marc de dades teclejant wb.

wb <- data.frame(country = c("Antigua and Barbuda", "Belize", "Costa Rica", "Dominica", "Dominican Republic",
                             "El Salvador", "Guyana", "Guatemala", "Haiti", "Honduras", "Jamaica", "Nicaragua", 
                             "Panama", "Surinam", "Trinidad and Tobago"), 
                 income = factor(c("high", "upper-middle", "upper-middle","upper-middle", "upper-middle", 
                                   "lower-middle", "upper-middle", "upper-middle","low", "lower-middle", "upper-middle",
                                   "lower-middle", "high", "upper-middle", "high")),
                 stringsAsFactors = FALSE)
countryincome
Antigua and Barbudahigh
Belizeupper-middle
Costa Ricaupper-middle
Dominicaupper-middle
Dominican Republicupper-middle
El Salvadorlower-middle
Guyanaupper-middle
Guatemalaupper-middle
Haitilow
Honduraslower-middle
Jamaicaupper-middle
Nicaragualower-middle
Panamahigh
Surinamupper-middle
Trinidad and Tobagohigh

Fixeu-vos en el procediment per convertir un factor en ordinal:

  • A dins de la funció factor(), indiquem que l’argument order a TRUE.
  • Indiquem a l’argument levels l’ordre dels factors, de menor a major.
wb$income <- factor(wb$income, order = TRUE,
                    levels = c("low", "lower-middle", "upper-middle", "high"))

Comproveu el resultat amb:

class(wb$income)
wb$income

Vectors lògics

Els vectors lògics també poden operar com a variable categòrica ordinal pel simple fet que TRUE és convertible a 1 i FALSE és convertible a 0. Fixem-nos què passa si convertim un vector lògic a vector numèric.

as.numeric(c(TRUE, FALSE))
## [1] 1 0

Això significa que TRUE pot ser interpretat com un 1 i FALSE com un 0. Per il·lustrar-ho crearem un marc de dades format per dos vectors, country i poverty. Primer creem els vectors i, a partir dels vectors, creem el marc de dades.

country = c("Armenia", "Austria", "Benin", "Bolivia", "Brazil", "Colombia", 
            "El Salvador", "Ethiopia", "Honduras", "Indonesia")
poverty = c(1.90, 0.7, 49.6, 6.4, 3.4, 4.5, 1.9, 26.7, 16.2, 7.2)
pov <- data.frame(country, poverty)

Observeu com qualsevol vector és convertible en un vector lògic. Mireu els següents exemples:

pov$country == "Benin" #preguntem si algun element del vector country porta el nom Benin
##  [1] FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
pov$poverty < 16 #preguntem si algun element del vector *poverty* és inferior a 16
##  [1]  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE FALSE FALSE  TRUE

Per passar qualsevol tipus de vector a vector lògic haurem de dominar els operadors relacionals. Aquest vídeo fa un resum dels operadors que hem vist fins ara:

Font: Datacamp

Per combinar varis resultats lògics és essencial que comprengueu com funcionen els operadors booleans:

  • AND: Utilitzarem el símbol &
  • OR: Utilitzarem el símbol |
  • NOT: Utilitzarem el símbol !=

El següent vídeo us ho explica.

Font: Datacamp

Vegem alguns exemples de com funcionen els operadors booleans:

pov$country == "Austria" | pov$poverty < 15
pov$country == "Austria" & pov$poverty < 15
!pov$country == "Austria" & pov$poverty < 15
pov$country != "Austria" & pov$poverty < 15
##  [1]  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE FALSE FALSE  TRUE
##  [1] FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [1]  TRUE FALSE FALSE  TRUE  TRUE  TRUE  TRUE FALSE FALSE  TRUE
##  [1]  TRUE FALSE FALSE  TRUE  TRUE  TRUE  TRUE FALSE FALSE  TRUE

Variables categòriques binàries

Les variables categòriques binàries només poden adoptar dos valors. Es poden crear amb vectors de caràcter, factors o vectors lògics, tal com s’ha mostrat en els anteriors apartats.

Variables numèriques

Les variables numèriques, anomenades també cardinals o quantitatives, són variables que representen nombres en els seus valors. Hi ha dos tipus de variables numèriques:

  • Les numèriques contínues accepten decimals.
  • Les numèriques discretes no accepten decimals.

Font: Alison Horst.

Operacions: Amb les variables numèriques es poden fer les següents operacions.
Igual: ==
No igual: !=
Més gran o igual que: >=
Més petit o igual que; <=
Més gran que: >
Més petit que: <
Sumar: +
Restar: -
Multiplicar: *
Dividir: /
Logaritme: log()
Etc.

Per defecte, si una variable conté nombres ens crearà un vector numèric, també anomenat double. Per crear un vector enter ho podem fer de dues maneres diferents:

enter1 <- c(4L, 8L, 15L, 16L, 23L, 42L)
typeof(enter1)
## [1] "integer"
enter2 <- as.integer(c(4, 8, 15, 16, 23, 42))
typeof(enter2)
## [1] "integer"

A l’hora de fer operacions amb un vector numèric o enter, podem fer dues coses:

  • Fer operacions d’un vector amb un nombre.
3 * c(1, 3, 6)
## [1]  3  9 18
  • Fer operacions entre dos vectors d’igual longitud.
c(1, 3, 6) * c(1, 3, 6)
## [1]  1  9 36
  • En canvi, en operacions amb vectors de diferent longitud ens donarà un avís.
c(1, 3, 6) * c(1, 3)
## Warning in c(1, 3, 6) * c(1, 3): longer object length is not a multiple of
## shorter object length
## [1] 1 9 6

Passar de numèric a categòric

Dues de les funcions més importants per pasar de variable numèrica a variable categòrica són if_else() i case_when().

  • Si volem transformar el vector numèric en una variable categòrica dictòmica utilitzarem if_else().
  • Si volem transformar el vector numèric en una variable categòrica de més de dues categories, utilitzarem case_when().

Són dues funcions del paquet dplyr, que haurem de carregar.

#recordeu que els paquets han d'estar prèviament instal·lats
library(dplyr)

if_else()

L’estructura de la funció if_else() consta de tres arguments, separats per comes:

  1. Condició lògica. El resultat del primer argument ha de ser un vector lògic que separi els valors que són TRUE i els que són FALSE.
  2. Valor nou que prendran els que siguin TRUE.
  3. Valor nou que prendran els que siguin FALSE.
if_else(pov$poverty >= 10, 1, 0)
##  [1] 0 0 1 0 0 0 0 1 1 0
if_else(between(pov$poverty, 5, 20), "Medium", "Other")
##  [1] "Other"  "Other"  "Other"  "Medium" "Other"  "Other"  "Other"  "Other" 
##  [9] "Medium" "Medium"

case_when()

L’estructura de la funció case_when() consta de mínim tres arguments, separats per comes:

  1. Condició lògica 1. Per tant, el resultat del primer argument ha de ser un vector lògic que separi els valors que són TRUE i els que són FALSE.
  2. Tots els TRUE ens els convertirà a la categoria que indiquem després del símbol ~.
  3. Condició lògica 2 i així successivament.
  4. Si volem indicar ‘la resta de valors’ ho farem amb un darrer argument on indiqui TRUE, seguit el símbol ~ i el valor que prendran la resta de valors.
pov$f_poverty <- case_when(pov$poverty < 2 ~ "Low", 
                           between(pov$poverty, 2, 10) ~ "Medium", 
                           TRUE ~ "High")

En el cas que, un cop categoritzada la variable, la vulguem fer ordinal:

pov$f_poverty <- factor(pov$f_poverty, order = TRUE, 
                        levels = c("Low", "Medium", "High"))

Annex

Creem un vector enter i comprovem que és enter

enter <- c(1L, 1L, 2L, 3L, 3L, 4L) 
typeof(enter)
## [1] "integer"
class(enter)
## [1] "integer"

El convertim a factor i veiem que segueix sent enter, però ara té la propietat factor i nivells associats.

enter <- as.factor(enter) 
typeof(enter) 
## [1] "integer"
enter
## [1] 1 1 2 3 3 4
## Levels: 1 2 3 4

Introduïm etiquetes per a cada nivell. Veiem que continua sent un vector enter, però cada nombre està associat amb una etiqueta.

levels(enter) <- c("Argentina", "Brazil", "Bolivia", "Colombia") 
enter
## [1] Argentina Argentina Brazil    Bolivia   Bolivia   Colombia 
## Levels: Argentina Brazil Bolivia Colombia
attributes(enter)
## $levels
## [1] "Argentina" "Brazil"    "Bolivia"   "Colombia" 
## 
## $class
## [1] "factor"

Apliquem la mateixa idea a la creació d’una variable categòrica dicotòmica que distingeixi entre països que siguin potència nuclear i potència no nuclear.

nuclears <- c("Nuclear", "Nuclear", "No Nuclear", "Nuclear", "No Nuclear", "Nuclear") 
typeof(nuclears)
## [1] "character"
class(nuclears)
## [1] "character"
factor_nuclears <- factor(nuclears)
typeof(factor_nuclears)
## [1] "integer"
class(factor_nuclears)
## [1] "factor"
factor_nuclears
## [1] Nuclear    Nuclear    No Nuclear Nuclear    No Nuclear Nuclear   
## Levels: No Nuclear Nuclear
attributes(factor_nuclears)
## $levels
## [1] "No Nuclear" "Nuclear"   
## 
## $class
## [1] "factor"

  1. A l’annex il·lustrem el procés de creació d’un vector a partir de les propietats d’un vector enter↩︎

Previous