Capítol 1 Introducció

1.1 Què és R?

R és un llenguatge de programació estadística molt utilitzat per a l’anàlisi de dades. És programari lliure, per la qual cosa és gratuït i no comercialitzable. R es pot fer servir directament a través de la consola que ve amb la instal·lació del llenguatge, però nosaltres farem servir el programa RStudio per fer operacions amb R. Això fa necessari que instal·lem primer R i després RStudio.

La potència de R prové bàsicament del fet que en ser un llenguatge de programació de codi obert els usuaris elaboren i posen a disposició de la comunitat d’usuaris paquets per funcions específiques que n’amplien exponencialment les possibilitats.

Entre aquests paquets n’hi ha que aporten funcions per tasques específiques i altres que estan orientats a la facilitat d’ús. Entre aquests, hi ha paquets que aporten interfícies gràfiques d’usuari (GUI) que converteixen R en un programa semblant a SPSS o JMP, amb l’avantatge de la gratuïtat i de la possibilitat d’accés a les funcions més avançades d’R a mesura que augmenta la nostra destresa i/o les nostres necessitats. Destaquen dues interfícies gràfiques, DeduceR i Rcommander, que tenen característiques molt semblants a SPSS. Nosaltres farem servir un entorn integrat de programació amb R anomenat RStudio, que és l’eina més popular i desenvolupada per treballar amb R que existeix. RStudio permet no només fer totes les operacions de R dins d’un mateix entorn integrat, sinó que té funcionalitats que permeten també integrar la feina d’anàlisi amb la producció de material escrit (informes, articles, llibres) dins del mateix entorn.

1.2 Instal·lació

1.2.1 Windows

Aquestes instruccions es basen en la instal·lació de R en un ordinador amb sistema operatiu Windows, però es pot instal·lar en altres sistemes com Mac OS i distribucions de Linux (e.g., Ubuntu).

  1. Troba la darrera versió de R. Per a fer-ho, ves al lloc web del CRAN (Comprehensive R Network). En aquest lloc hi veuràs la informació.

Pàgina inicial del CRAN.

Sota l’epígraf Download and Install R hi ha les opcions per a 3 sistemes operatius. Escull el que et convingui. Suposem que escollim l’opció de Windows. Aleshores segueix les instruccions següents:

  1. Fes click sobre Download R for Windows
  2. En les opcions a sota de “Subdirectories”, fes click sobre l’enllaç base
  3. En la pàgina següent, veuràs un enllaç que diu alguna cosa com Download R 4.0.2 for Windows o amb una versió superior. Fes-hi click.
  4. L’ordinador et preguntarà si vols desar el fitxer executable R-4.0.2-win.exe. Desa’l i després ves a la carpeta on l’hagis desat (per exemple, Baixades) i fes-hi doble click.
  5. És un executable similar al d’altres programes. Segueix totes les instruccions i instal·la la versió per defecte, no cal que facis cap canvi.
  6. Quan el tinguis instal·lat, busca la icona R al teu escriptori (és possible que s’hagi creat un accés directe) i fes-hi doble click. T’hauria de sortir una finestra (la consola de R) semblant a aquesta.

Consola de R.

1.2.2 Altres sistemes operatius

Si vols instal·lar R en un ordinador amb un altre sistema operatiu, tria el teu sistema operatiu en aquest enllaç i segueix les instruccions de l’instal·lador. Si ho vols instal·lar en un sistema operatiu Ubuntu (Linux), pots seguir les instruccions que hi ha aquí.

1.3 RStudio

Com dèiem més amunt, nosaltres treballarem amb R des d’un altre programa: RStudio. RStudio és un editor que permet executar R, a banda de moltes altres coses. Com R, RStudio també és gratuït.

  1. Ves al lloc web de RStudio
  2. Fes click sobre l’enllaç Download RSTUDIO desktop.
  3. A la pàgina que se t’obre, fes click sobre el botó Download de la primera columna (sota el títol RStudio Desktop, Open Source License).
  4. A continuació, tria el teu sistema operatiu (Windows, Mac OSX, Linux)
  5. Et demanarà si vols desar l’arxiu executable. Desa’l, ves a la carpeta on l’has desat i fes-hi doble click.
  6. Segueix totes les instruccions de l’instal·lador.

Un cop instal·lat, fes doble click sobre la icona de RStudio i se t’hauria d’obrir una finestra com aquesta.

Finestra inicial de RStudio.

1.3.1 Interfície de RStudio

RStudio té una interfícia senzilla: una pantalla dividia en tres finestres. La finestra de l’esquerra és la consola de R, on s’executen tots els comandaments. A la dreta, la finestra superior indica en tot moment els objectes que anem creant (per exemple, variables que creem). Finalment, la finestra inferior dreta conté diverses pestanyes que indiquen funcions diferents, però sobretot constitueix la finestra on veurem els gràfics que crearem.

Podem importar dades en múltiples formats (Excel, SPSS, Stata, text, csv, etc.), tot i que convé comprovar sempre que la importació s’ha realitzat correctament. A més, en R podem tenir diverses bases de dades obertes simultàniament, cosa que pot resultar útil.

1.3.2 Una quarta finestra

Tot i que la interfície mostra per defecte 3 pantalles, el més habitaul és que treballem amb 4 finestres. Aquesta quarta finestra és la del script de codi on crearem els comandaments que farem que R executi. Per crear un script de codi de R anirem al menú superior, a File (o Arxiu)/New File/R Script. També el podem crear directament fent Control+Majúscula+N. Se’ns obrirà un document completament en blanc. Això es un arxiu de codi.

1.3.3 Dades

Les bases de dades per fer anàlisi estadística estan organitzades sovint en forma de matrius rectangulars, en què les files representen els casos o observacions, i les columnes les variables, o característiques dels casos. Així, cada fila pot ser un individu, si treballem amb dades individuals (d’enquesta, cens, etc.) o un municipi, un país, una empresa, etc. En cada columna s’hi representa una característica del cas.

1.3.4 Consola

La finestra de la consola (ara inferior esquerra) té bàsicament un símbol > i el cursor. El codi de R s’executa després del símbol >. Si hi poseu, per exemple, \(5+2\) i premeu Enter, R us respondrà amb un resultat:

> 5+2
## [1] 7

La consola és el lloc a través del qual ens comuniquem amb R (li donem ordres) i R amb nosaltres (ens dóna resultats, missatges d’error, etc.). Per tant, la consola és l’essència de R, i el primer missatge que R ens dóna és una breu presentació de la versió de R que tenim instal·lada, el tipus de llicència sota la qual tenim dret a utilitzar el software, com podem citar-lo, i alguns comandaments bàsics per obtenir ajuda:

R version 3.4.2 (2017-09-28) – “Short Summer” Copyright (C) 2017 The R Foundation for Statistical Computing Platform: x86_64-pc-linux-gnu (64-bit)
R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type ‘license()’ or ‘licence()’ for distribution details.
Natural language support but running in an English locale
R is a collaborative project with many contributors. Type ‘contributors()’ for more information and ‘citation()’ on how to cite R or R packages in publications.
Type ‘demo()’ for some demos, ‘help()’ for on-line help, or ‘help.start()’ for an HTML browser interface to help. Type ‘q()’ to quit R.

1.3.5 Instal·lació de paquets

Els paquets són conjunts de codi en R que ens permeten ampliar les funcionalitats del llenguatge. Cada paquet té un nom propi i cal instal·lar-los a partir d’R mateix. Per fer-ho hem de fer servir la següent funció. La podem executar a la consola.

> install.packages('nom_del_paquet')

1.3.6 Menús i codi

R és un llenguatge pensat per ser escrit per humans, no executat de forma indirecta a través de clicks en un menú. Això vol dir que, a diferència d’altres programaris d’estadística (com SPSS), R està dissenyat expressament per ser utilitzat directament com a llenguatge. Tot i això, algunes interfícies com DeduceR o R Commander han intentat imitar la forma de treballar de SPSS (a través de menús), amb resultats força bons. Tanmateix, R evoluciona constantment i augmenta la seva capacitat i riquesa de funcions, de manera que les interfícies basades en menús queden de seguida limitades. Encara que la corba d’aprenentatge del codi escrit té un pendent més marcat que la dels menús, val molt la pena de fer l’esforç d’acostumar-se a escriure codi de R sense fer servir menús. Com amb la poesia, R s’aprèn amb pràctica i imitant el que altres escriuen.

1.3.7 Configuració

Configurem R perquè deixi de fer servir al notació científica per a representar decimals llargs.

options(scipen = 999)

1.4 LaTeX

El llenguatge nadiu de RStudio per a la generació d’informes en què pugueu integrar el codi de R i, per tant, generar resultats a mesura que feu l’anàlisi, és R Markdown. Per generar informes en R Markdown i compil·lar-los en format HTML o altres, només caldrà instal·lar cap altre software. Ara bé, per treure tot el suc de les funcionalitats de generació d’informes d’alta qualitat amb RStudio és recomanable tenir també instal·lada una distribució de LaTeX. Per instal·lar-la, recomanaria que us baseu en els recursos que s’ofereixen al LaTeX Project. Si feu córrer alguna distribució de Linux, instal·leu TeX Live; si feu anar Mac OS, MacTeX; si feu anar Windows, instal·leu TeX Live.

1.5 Tipus d’arxius a R

En l’entorn de R, tot pot ser un objecte. Les dades són objectes, les funcions són objectes, les variables també. Una de les operacions més repetides quan escrivim codi amb R és crear i donar nom als objectes, de manera que els podem cridar en qualsevol moment de les nostres anàlisis. Podem fer servir funcions existents per dur a terme accions sobre objectes i obtenir resultats. Per exemple, com veurem més endavant, la funció lm() ens permet estimar models de regressió lineal. També podem crear les nostres pròpies funcions, guardar-les i tornar-les a recuperar en futures anàlisis. Un cop acabada una sessió de treball amb R, els objectes que hem creat no romanen excepte si els guardem. De fet, els resulats d’anàlisis estadístiques són també objectes, de manera que els podem reutilitzar per dur a terme altres accions sobre ells. En aquest sentit, en l’entorn de R, l’analista social és a mig camí entre l’analista de dades i el/la programador/a.

Quan treballem en R i RStudio hi ha diversos arxius que podem conservar; els veurem a continuació.

1.5.1 Dades

Les bases de dades es poden guardar en molts formats diferents. Generalment és bona idea guardar-ne una còpia intacta (tal i com ens les van donar) en una carpeta específica, sense obrir-la; i si volem anar conservant les modificacions que hi fem, també una altra còpia modificada. Sol ser bona idea guardar les dades en formats nadius d’R (com .RData), però també les podem conservar sense problemes en altres formats (.dta, .csv, .txt) tenint en compte que alguns d’aquests formats potser no conserven tota la informació associada.

1.5.2 Codi

Totes les ordres que anem executant les hauríem de guardar en un script de codi, que només és un document amb l’extensió .R i té la propietat que podem enviar els comandaments que anem escrivint directament a la consola per tal que siguin executats o avaluats per R. Aquest script el podem guardar, de manera que quan tornem a obrir-lo podrem tornar a executar tot el codi que havíem creat quan vam acabar la sessió la darrera vegada. A més, com que no és estrany que entre una sessió d’anàlisi i una altra pugui passar molt de temps, el fet de tenir l’script guardat és una manera força segura (1) d’evitar errors i (2) de poder saber exactament què havíem fet la darrera sessió amb les nostres dades, és a dir, quines decisions havíem pres i per què. La possibilitat de replicació és una bona pràctica de programació.

1.5.3 Output

També podem triar guardar tot l’output o només els resultats. Això ens generarà un arxiu de text amb tot el que hem anat fent. Generalment sol ser més convenient guardar només l’script de codi i si de cas ja les tornarem a executar que no els resultats.

1.5.4 Workspace

R és un entorn de programació basat en objectes i, per tant, tenim l’opció de guardar tot l’espai de treball o, el que és el mateix, tota la sessió que tenim en marxa, incloent-hi totes les dades que tinguem carregades, les taules i matrius que haguem generat, els comandaments que hem executat, etc. Resulta útil en nivells una mica més avançats, però hem de tenir en compte que pot ocupar molt espai de memòria. De moment, no és recomanable guardar-lo.

1.5.5 Importació de dades

Un dels punts forts d’R és que pot llegir i escriure dades en múltiples formats (SPSS, Stata, Excel, csv, txt, etc.) sovint gràcies als paquets addicionals incorporats a R. Això ens deslliura de servituds sobre els formats amb què podem treballar.

1.5.5.1 Múltiples arxius en una sessió?

Una de les peculiaritats d’R és que ens permet tenir oberta més d’una base de dades alhora i, fins i tot combinar variables de diferents bases de dades en una sola anàlisi (cosa poc recomanable, d’altra banda). Cal anar amb compte, sobretot si tenim més d’una base de dades semblant, d’assegurar-nos que treballem realment sobre la que nosaltres volem treballar.

Tanmateix, un dels punts febles d’R—que segur que ens portarà algun maldecap—és que no sempre les dades s’importen de manera adient. Cal que ens assegurem sempre que hem aconseguit importar les dades tal com volíem, ja que si no podem cometre errors importants en les nostres anàlisis.

Per minimitzar problemes, hi ha una sèrie de consideracions a fer:

  • R no és gaire amic dels accents i caràcters no estàndard (anglo). De fet, si hi ha accents (o cap ç o ñ) a la ruta de l’arxiu que volem obrir, possiblement no podrem fer-ho. Addicionalment, si hi ha caràcters especials en les etiquetes de les variables i/o valors de la nostra base de dades, possiblement tinguem problemes. Per això, val més evitar-los.

  • Per a R els decimals els marquen els punts, per defecte. És possible que tinguem Excel o altres programes predeterminats per emprar comes per marcar els decimals i això de vegades ens pot comportar algun maldecap. En general, és aconsellable tenir el punt com a separador predeterminat a tot arreu: això ens estalviarà maldecaps. Tanmateix, això no sempre és fàcil de canviar. Però amb LibreOffice o Excel, una manera de fer-ho és canviar la llengua associada a un full de càlcul a l’anglès. Ja que hi som, evitem en general fer servir el separador dels milers en les dades que tinguem en fulls de càlcul (com Excel o LibreOffice Calc).

  • El procés d’importació de dades es pot personalitzar de manera completa. De fet, quan importem dades hem d’especificar, per exemple, si la primera fila d’un arxiu correspon als noms de les variables, o també quin símbol (una coma, un punt i coma, etc.) especifica la divisió entre columnes.

  • Tot i que és possible fer-ho, d’entrada l’entorn R no resulta especialment còmode per etiquetar les dades (variables i valors). Per això és aconsellable tenir sempre a mà un bon llibre de codis de les nostres dades, de tal manera que sempre sapiguem què representa cada variable/valor.

  • Els arxius de text i/o separats per comes (.csv) acostumen a donar menys problemes, tot i que contenen menys informació sobre les nostres dades. R es mou realment bé amb dades sense format.

1.6 Tipus de variables

Com hem vist abans, les variables poden ser de diversos tipus (numèriques, categòriques, etc.). Aquesta distinció és genèrica, però després cada software té també els seus tipus de variables amb què emmagatzema les dades. Aquests tipus serveixen perquè el programa pugui emmagatzemar les dades de la millor manera i, sobretot, tractar-les de forma convenient quan fem anàlisis. Podrem canviar les variables de tipus (per exemple, de contínues a categòriques), però cal anar amb compte perquè alguns canvis ens poden portar a perdre la informació si no anem amb compte. En la sessió sobre gestió de dades aprendrem a canviar el tipus de variable: recodificar.

1.6.1 Character

Són variables de text, que R no processarà com a informació quantitativa que pugui interpretar o amb la que pugui operar. Serveixen bàsicament per emmagatzemar noms, descripcions, etc.

1.6.2 Factor

Són variables categòriques, que més que valors en si, prenen diferents “nivells” (en anglès, levels) amb les seves corresponents etiquetes. Podem indicar al programa si els nivells estan ordenats o no, però, a diferència d’altres programes, en R no assignem lliurement valors numèrics a les categories. Si volem fer això, serà millor treballar amb variables numèriques.

1.6.3 Numeric

Són variables numèriques que poden prendre qualsevol valor.

1.6.4 Integer

Son variables numèriques que només poden prendre valors enters, no decimals.

1.6.5 Logical

Variables lògiques, que prenen valors TRUE i FALSE.

1.6.6 Date/Time

Quan guardem informació de dates i hores, podem emprar aquests formats i aplicar-hi funcions específiques que ens permetran operar amb aquesta informació i, per exemple, calcular durades, sumar temps, canviar les unitats de temps, etc.

1.7 Flux de treball en anàlisi de dades per a les ciències socials

Abans de començar a analitzar dades, és important que establim un entorn de treball adequat. Aquest entorn de treball, en R, s’anomena directori de treball (working directory). Com anirem veient, és molt important que, com a analistes de dades, adoptem bones pràctiques, una d’elles és un cert nivell d’organització del treball de manera que es minimitzin els errors.

1.7.1 Establiment d’una estructura de treball

Per començar, és recomanable que quan encarem un procés d’anàlisi de dades ho fem pensant en termes de projectes. En les ciències socials, els projectes tenen sovint algun tipus de producte escrit, de manera que podem identificar projectes diferents per a productes escrits diferents: informes, tesis doctorals, treballs de fi de grau o de màster, articles, llibres. Tots ells podrien ser projectes separats, i recomanem que, sigui quin sigui el nostre projecte, sempre—com fan els enginyers—treballem amb una mateixa estructura.

L’estructura del projecte no ha de ser gaire complicada, sinó que, en termes generals, hauria de tenir com a mínim quatre o cinc subdirectoris, per exemple els següents: :

  • /dades: on guardarem les dades que necessitem analitzar
  • /doc: on guardem la documentació rellevant del projecte (per exemple, un qüestionari o una fitxa tècnica, així com informes o articles sobre el tema del projecte que hagin escrit altres persones)
  • /graphs: on guardarem els gràfics que crearem en el projecte
  • /informes: on generarem i guardarem el(s) producte(s) escrit(s) del nostre projecte: article, llibre, informe, diapositives per a una presentació, etc.
  • /scripts: o guardem els scripts de codi des d’on executem les anàlisis de dades

Un cop fet això, utilitzem la funció getwd() per identificar exactament en quin directori està treballant R, i setwd() per establir la ruta del directori on volem que R treballi:

> getwd()                             
> setwd("ruta_a_la_localització_del_teu_projecte") 

Ja està, tot ordenat.

1.8 El primer dia amb R

Obriu RStudio i prepareu-vos per a la primera sessió amb R. Creeu/obriu un arxiu de codi nou, un script, que podeu anomenar sessio1.R. Guardeu el vostre arxiu de codi (acabat amb l’extensió .R) a la subcarpeta /tests del vostre projecte. Tingueu en compte que tot i que el document és un document de text pla, el fet que el guardeu amb l’extensió .R us permet enviar comandaments des de l’script a la consola.

És important començar per allò que ens pot ajudar. Si escriviu la línia de codi que hi ha a continuació i, amb el cursor a sobre d’ella premeu Control+Enter, aquest comandament s’executarà a la consola i se us obrirà una pàgina d’ajuda.

> help.start()

Aquesta pàgina conté un conjunt de recursos oficials de R: manuals d’ús, descripció de llibreries, preguntes freqüents, etc. De vegades, però, tenim dubtes sobre funcions concretes. Per exemple, a continuació demanem informació sobre la funció lm():

> help("lm")

O, encara més, podem cercar informació dins de R a través de paraules clau. Imaginem que volem informació sobre paquets o llibreries que permetin estimar models de regressió. Ho podem fer així:

> help.search("regression")

R ens ofereix una llista de llibreries (el nom que hi ha abans del signe ::) i funcions concretes (després de ::) que permeten estimar tipus diferents de regressió.

Tanmateix, sovint és més útil rebre ajuda de la comunitat d’usuaris. Les següents pàgines són de gran utilitat (cliqueu-hi a sobre, per a més informació):

1.8.1 La vostra primera sessió amb R

Dèiem més amunt que qualsevol cosa que crees amb R és un objecte (similar a altres llenguatges de programació com Python). Els objectes poden ser nombres, fórmules, col·leccions d’objectes, noms, etc. Per crear el vostre primer objecte, escriviu i executeu el següent en el vostre script:

> a <- 5

Aquest comandament crea un objecte anomenat a al qual hem donat el valor \(5\). La fletxa invertida \(<-\) té la funció d’assignació i és equivalent a \(=\). Tanmateix, acordem a partir d’ara que no farem servir \(=\) per a les assignacions, perquè té altres funcions en R i pot portar a confusions. Amb RStudio podeu introduir el símbol d’assignació prement Alt+-. Si ara executeu l’objecte a directament, R us respondrà:

> a
## [1] 5

Felicitats, heu començat a programar amb R!

1.8.1.1 No només nombres

Afortunadament, R no treballa només amb nombres. Per assignar valors no numèrics (càracters, cadenes de caràcters), hem de fer servir les cometes:

d <- "a"
d
## [1] "a"

Si no féssim servir les cometes, a l’objecte d li estem assignant el valor de l’objecte a que havíem creat abans, que és el valor numèric \(5\).

d <- a
d
## [1] 5

Per tant, hem de tenir molt en compte quin tipus d’objecte estem creant a cada moment. Per continuar amb els valors amb càracters, podem assignar qualsevol nom a un objecte, excepte els noms que estan reservats per a funcions (R ens avisarà si ho intentem fer sense saber-ho). En principi no hi ha problema en fer accents o caràcters especials en els noms d’objectes que creem, com en l’exemple a continuació, però no ho recomanem per facilitar la replicació.

cançó <- "Whiplash"
cançó
## [1] "Whiplash"

Els caràcters que constitueixen el valor que assignem a un objecte poden ser tan llargs com vulguem. Aviam, hi ha límits físics a aquesta llargada, perquè els objectes de R ocupen memòria. Per exemple, el nombre de bits màxims que un sol objecte de tipus caràcter pot tenir en R és \(2*10^9\), és a dir, immensament gran. Exemples més normals de cadenes de caràcters són:

# Noms més llargs
f <- "Daughters of the SoHo Riots"

# No cal que el text que hi posem tingui cap sentit
g <- "Es el alcalde el que quiere que sean los vecinos el alcalde."

Fixeu-vos que en aquest últim exemple, també hi ha una part de text precedida del signe #. Aquest és el signe que fem servir per indicar a R que comença un comentari, és a dir, una porció de text que ens serveix a nosaltres per comentar sobre el que estem fent a cada moment. Tot allò que escrivim després del signe # serà ignorat per R, no serà executat. Els comentaris són molt útils per deixar constància o documentar diverses etapes del procés d’anàlisi.

1.8.1.2 Llistem objectes i els eliminem

En R és tan important saber crear objectes com destruir-los de forma selectiva. Per saber, en qualsevol moment, quants objectes tenim a la memòria, fem servir la funció ls(), i per eliminar objectes concrets fem servir rm():

# Aquesta funció crida la llista de tots els objectes que tinguem a la memòria
ls()

# Aquesta funció elimina un objecte concret, el que posem entre parèntesis
rm(a)
ls()

# Què passa si cridem l'objecte "a" ara?
a

Si cridem un objecte que ja no existeix, R ens donarà un missatge d’error.

1.8.1.3 Manipulació d’objectes

Un cop sabem com crear objectes, ens podem dedicar al que és realment interessant amb R: manipular-los. Comencem creant dos objectes, a i b, i assignant-los valors numèrics.

# Creem dos altres objectes, anomenats a i b, 
# i mirem quin valor tenen
a <- 5
b <- 4

Un cop creats, podem fer coses directament amb els objectes, com sumar-los.

a + b
## [1] 9

De fet, podem crear un objecte nou al qual assignem l’operació de sumar dos altres objectes.

c <- a + b
c
## [1] 9

Ara bé, no podem fer qualsevol operació amb qualsevol tipus d’objectes. Naturalment, no podem sumar nombres i caràcters:

# Què passa quan intentem sumar un caràcter i un nombre?
d <- "z"
a + d

1.8.1.4 Operacions bàsiques

Les operacions aritmètiques bàsiques amb R són les següents:

5+2 # suma
5-2 # resta
5*2 # multiplicació
5/2 # divisió
5^2 # exponents
(5+2)*(8/4) # concatenació d'operacions

1.8.2 Tipus d’objectes

Una de les grandeses de R és que aquestes operacions no només es poden dur a terme amb nombres simples, sinó que hi ha altres tipus d’objectes de dades a R amb els quals podem fer tot tipus d’operacions. Els tipus bàsics són:

  • vectors
  • matrius
  • data frames
  • llistes

1.8.2.1 Vectors

Un vector és només una concatenació d’elements. Aquests elements poden ser nombres, caràcters o el que sigui. Per construir vectors en R fem servir la funció de concatenació c():

a <- c(1, 2, 3, 4)
a
## [1] 1 2 3 4

Amb aquesta operació acabem de construir un objecte a que és un vector format per quatre elements, els nombres \(1, 2, 3, 4\). Com que els elements del vector a són nombres consecutius, una manera més ràìda de crear un vector seria donar a R l’ordre de crear un vector donant-li només el primer i el darrer nombre de la concatenació qeu volem obtenir. Per exemple, si volguéssim obtenir un vector z que contingués els nombres del \(3\) al \(20\), ho podem fer sense utilitzar la funció c() i fent servir només el signe : entre els dos nombres esmentats:

z <- 3:20
z
##  [1]  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20

També podem crear vectors que siguin sèries d’elements a partir d’algun altre criteri. Per exemple, si volem crear una sèrie del número 5 repetit 25 vegades, farem servir la funció rep():

x <- rep(5, times = 25) # Amb nombres
x
##  [1] 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
y <- rep("b", times = 15) # Amb caràcters
y
##  [1] "b" "b" "b" "b" "b" "b" "b" "b" "b" "b" "b" "b" "b" "b" "b"

També podem crear repeticions de més d’un nombre. A continuació repetim la sèrie de 1 a 5 quatre vegades:

x <- rep(1:5, times= 4)
x
##  [1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5

De la mateixa manera que ho fem amb nombres també ho podem fer amb caràcters. Per exemple, R entén que les lletres de l’abecedari tenen un ordre establert (de la a a la z, en l’alfabet llatí), de manera que podem també crear sèries de caràcters:

y <- rep(letters[1:8], 4) # Les 8 primeres lletres de l'alfabet repetides 4 vegades
y
##  [1] "a" "b" "c" "d" "e" "f" "g" "h" "a" "b" "c" "d" "e" "f" "g" "h" "a" "b" "c" "d" "e" "f" "g" "h" "a" "b" "c" "d" "e" "f"
## [31] "g" "h"
j <-  rep(LETTERS[1:8], 4) # El mateix però amb les lletres majúscules
j
##  [1] "A" "B" "C" "D" "E" "F" "G" "H" "A" "B" "C" "D" "E" "F" "G" "H" "A" "B" "C" "D" "E" "F" "G" "H" "A" "B" "C" "D" "E" "F"
## [31] "G" "H"

També podem fer que R ens creï una repetició recursiva d’elements Per exemple, dels nombres de l’1 al 5, on cada nombre sigui repetit 6 vegades, tot plegat 5 vegades diferents:

x <- rep(1:5, each = 6, times = 5)
x
##   [1] 1 1 1 1 1 1 2 2 2 2 2 2 3 3 3 3 3 3 4 4 4 4 4 4 5 5 5 5 5 5 1 1 1 1 1 1 2 2 2 2 2 2 3 3 3 3 3 3 4 4 4 4 4 4 5 5 5 5 5 5
##  [61] 1 1 1 1 1 1 2 2 2 2 2 2 3 3 3 3 3 3 4 4 4 4 4 4 5 5 5 5 5 5 1 1 1 1 1 1 2 2 2 2 2 2 3 3 3 3 3 3 4 4 4 4 4 4 5 5 5 5 5 5
## [121] 1 1 1 1 1 1 2 2 2 2 2 2 3 3 3 3 3 3 4 4 4 4 4 4 5 5 5 5 5 5

Finalment, en comptes de sèries repetides, podem voler seqüències de nombres que s’alternin segons algun criteri que nosaltres establim. Per exemple, si volem una sèrie de l’1 al 50 però només volem els nombres senars:

seq(from = 1, to = 50, by = 2)
##  [1]  1  3  5  7  9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49

1.8.2.2 Operacions amb vectors

Un cop creat un vector amb elements numèrics, podem fer totes les operacions que les matemàtiques permeten fer amb vectors, com sumar un nombre a un vector (que és igual a la suma d’aquest nombre a cadascun dels elements del vector), entre altres:

a + 4 # sumar un nombre a un vector
## [1] 5 6 7 8
a
## [1] 1 2 3 4
b <- a/4 # dividir un vector per un mombre
b
## [1] 0.25 0.50 0.75 1.00
c <- c(1, 2, 3)
a*c # R ofereix un missatge d'avís perquè a i c tenen llargades diferents
## Warning in a * c: longer object length is not a multiple of shorter object length
## [1] 1 4 9 4

Finalment, els elements d’un vector no han de ser necessàriament numèrics, sinó que un vector pot contenir també caràcters, operadors lògics (TRUE/FALSE) o dates. De tota manera, si barregem elements de tipus diferents en un vector, com a l’exemple següent, R pren una decisió i converteix tots els elements del vector al mateix tipus d’element. Així, per exemple, el vector d conté tres nombres (\(1,2,3\)) i un caràcter (k). Si els combinem en un sol vector i cridem el vector, R converteix tots els elements en el mateix tipus:

d <- c(1, 2, 3, "k") # què passa aquí?
d
## [1] "1" "2" "3" "k"

Fixeu-vos que quan hem cridat el vector d, tots els seus elements ara van entre cometes i, per tant, són ca ràcters.

1.8.2.3 Extracció d’elements de vectors

El nombre d’elements d’un vector és la seva largada (length), i podem conèixer-la mitjançant la funció length():

z <- seq(1, 20, 1)
z
##  [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20
length(z)
## [1] 20

En efecte, R ens diu que el vector z conté 18 elements. De vegades, però, volem accedir només a una part d’un vector o llistat d’elements. Per exemple, tornem al vector z havíem creat. Imaginem que volem saber a quin nombre correspon el sisè element d’aquest vector. Ho podem saber mitjançant l’ús dels claudàtors ([]), i R ens dirà que, en efecte, el sisè element del vector z correspon al número \(8\).

z[6]
## [1] 6

De la mateixa manera, podem accedir a més d’un element del vector a la vegada. Si, per exemple, volem extreure el sisè, vuitè i desè elements del vector z, el que farem serà construir un vector que identifiqui els elements que volem extreure, i el farem servir a dins dels claudàtors:

z[c(6, 8, 10)]

Fins i tot podríem haver donat primer un nom al vector que conté els elements que identifiquen la localització dels nombres que volem extreure, i després fer servir directament aquest objecte per extreure aquests elements, amb què obtenim exactament el mateix resultat:

b <- c(6, 8, 10)
z[b]
## [1]  6  8 10

De la mateixa manera, de vegades necessitem indexar de forma negativa, és a dir, establir quins elements no volem que R ens doni. Per exemple, si continuem amb l’exemple anterior, podríem dir a R que volem tots els elements de z excepte el segon element, ho farem fent servir el signe negatiu (\(-\)):

z[-2]
##  [1]  1  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20

Si volem definir més d’un element de forma negativa, ho podem fer de la mateixa manera que ho fem de forma positiva, és a dir, definint un vector a dins dels claudàtors, o definint-lo primer assignant-li un nom i després fent servir el nom. Per exemple, si volem tots els elements de z excepte els que es contenen a b:

z[-c(6, 8, 10)] # Definim el vector a dins dels claudàtors
##  [1]  1  2  3  4  5  7  9 11 12 13 14 15 16 17 18 19 20
b <- c(6, 8, 10) # Assignem primer un objecte i després indexem
z[-b]
##  [1]  1  2  3  4  5  7  9 11 12 13 14 15 16 17 18 19 20

Fins ara hem tractat amb vectors, que constitueixen col·leccions de dades unidimensionals. Ara bé, el més habitual és que treballem amb dades que tenen, almenys, dues dimensions, és a dir, estructures rectangulars de dades on les files són observacions i les columnes variables. En R hi ha dos tipus de tipus de dades que responen a aquest esquema: matrius i data frames. A continuació veurem com són aquests dos tipus i com els claudàtors per indexar ([]) funcionen també aquí per extreure’n els elements que ens interessin.

1.8.2.4 Matrius

Ras i curt, una matriu és només una col·lecció de vectors. A continuació fem servir la funció matrix() per convertir un vector a en una matriu d de 2 columnes (ncol=2). L’argument byrow=TRUE especifica a la funció que volem que els elements de la matriu siguin col·locats per files.

a <- 1:8
d <- matrix(a, ncol=2, byrow=TRUE)
d
##      [,1] [,2]
## [1,]    1    2
## [2,]    3    4
## [3,]    5    6
## [4,]    7    8

Els índexs negatius també els podem fer servir en matrius, de forma que podem extreure elements solts, columnes senceres o files senceres. Per exemple, si volem obtenir l’objecte d excepte la tercera fila:

d[-3, ]
##      [,1] [,2]
## [1,]    1    2
## [2,]    3    4
## [3,]    7    8

Fixeu-vos que les files es defineixen abans de la coma que posem dins dels claudàtors ([,]). Si volem identificar columnes, ho farem després de la coma:

d[, -1]
## [1] 2 4 6 8

1.8.2.5 Data frames

Els data.frames són una variant de les matrius per guardar dades en què R ja assumeix que les files són observacions i les columnes són variables. Les columnes (i.e., les variables) poden ser numèriques, categòriques (factors), lògiques, caràcters o amb format de data. Per continuar amb l’exemple anterior, podem construir un data frame f a partir de la matriu d:

f <- data.frame(d)
f
##   X1 X2
## 1  1  2
## 2  3  4
## 3  5  6
## 4  7  8

Fixeu-vos que quan ara crideu el data frame f que hem creat, R ha assignat un nom a cada variable (X1 i X2), ja que nosaltres no ho hem fet. Podem crear data frames tot especificant nosaltres els noms de les variables. Per exemple, imaginem que volem crear una base de dades amb noms dels poetes que ens agraden i alguna informació sobre ells, com l’any de naixement i mort:

g <- data.frame(
  Nom = c(
    "Gabriel Ferrater", "Elizabeth Bishop", "J. V. Foix", "Rosa Leveroni"
  ), 
  Any.naix = c(1922, 1911, 1893, 1910),
  Any.mort = c(1972, 1979, 1987, 1985)
)
g
##                Nom Any.naix Any.mort
## 1 Gabriel Ferrater     1922     1972
## 2 Elizabeth Bishop     1911     1979
## 3       J. V. Foix     1893     1987
## 4    Rosa Leveroni     1910     1985

Així, R assumeix que les files del data frame g són observacions diferents de la unitat d’anàlisi (en aquest cas, poetes), mentre que cada columna constitueix una característica diferent de cada observació (nom, data de naixement, data de mort). És en aquest sentit que considerem que, a diferència dels vectors, les matrius i els data frames són bi-dimensionals.

1.8.2.6 Indexació de data frames

Com que tenen dues dimensions, a l’hora d’extreure elements concrets d’un data frame o d’una matriu, haurem de distingir entre files i columnes a l’hora de fer servir els claudàtors ([]). Per exemple, si volem obtenir tots els anys de naixement dels nostres poetes de g haurem de demanar a R que ens doni tota la segona columna:

g[, 2]
## [1] 1922 1911 1893 1910

Fixem-nos com acabem de fer servir els claudàtors. A diferència del cas dels vectors, en aquest cas hem inclòs una coma per especificar la columna. Doncs bé, en objectes bidimensionals com matrius i data frames, l’esquema és que, dins del claudàtor, el(s) nombre(s) que posem abans de la coma es refereix(en) a les files, i el(s) que posem després a les columnes.

Així, si volem obtenir tota la informació de la primera observació (fila) del nostre data frame sobre poetes, escriurem:

g[1, ] 
##                Nom Any.naix Any.mort
## 1 Gabriel Ferrater     1922     1972

I obtindrem tota la informació sobre el poeta Gabriel Ferrater. En cas que vulguem només la data de naixement de la tercera observació, escriurem:

g[3, 2] 
## [1] 1893

És a dir, ordenarem a R que, del data frame g, ens extregui l’element corresponent a la tercera fila, segona columna. A banda d’aquesta forma d’extreure elements a través de claudàtors, també podem obtenir variables d’un data frame cridant-les pel seu nom. Per fer-ho, farem servir el símbol del dòlar ($).

g$Any.naix   
## [1] 1922 1911 1893 1910

Fixem-nos, finalment, que g$Any.naix en realitat és un vector (en aquest cas, una concatenació d’anys de naixement). Si volem obtenir, per exemple, el tercer element d’aquesta variable, ho farem tal i com ho fèiem amb els vectors més amunt:

g$Any.naix[3] #L'any de naixement de J. V. Foix
## [1] 1893

1.9 Les dades del curs

Per tal de poder seguir els propers capítols et pots descarregar les dades necessàries per a tots els apartats i exercicis en aquest enllaç.

El curs està pensat de manera que tinguin un directori anomenat data en què hi hagi el contingut del zip descomprimit. Un cop la carpeta estigui creada pots situar el directori de treball d’R a la carpeta pare per accedir a les dades amb més comoditat.

Per exemple si situes la teva carpeta data dins d’una carpeta anomenada projectesR a l directori del teu usuari pots fer:

# per exemple:
setwd('C:\Users\NomUsuari\projectesR\')

1.10 Exercicis

  1. Defineix un objecte anomenat a i fes que sigui un vector de 4 elements que siguin els nombres enters del 5 al 8, ambdós inclosos.

    1. Llista el segon element de a.
    2. Llista el quart element de a.
    3. Calcula el producte dels elements segon i quart de a
    4. Assigna els nombres enters 3 i 4 a un objecte b, després utilitza b per extreure els elements tercer i quart de l’objecte a.
    5. Extreu tots els elements de a excepte el segon element.
    6. Extreu tots els elements de a excepte els elements tercer i quart.
  2. Defineix una matriu amb tres files i tres columnes, en la qual els elements siguin els enters de l’1 al 9, de manera que la primera fila contingui els enters de l’1 al 3, la segona del 4 al 6 i la tercera del 7 al 9.

    1. Extreu el valor que hi ha a la cel·la de la segona fila, segona columna.
    2. Extreu i llista els valors de tota la segona fila.
    3. Extreu i llista els valors de tota la tercera columna.
  3. Defineix un objecte que sigui un data frame que tingui els mateixos valors que la matriu definida a l’apartat 2 d’aquest exercici.

    1. Extreu el valor de la segona variable, segona observació.
    2. Extreu totes les dades corresponents a la segona observació.
    3. Extreu tota la tercera variable.
  4. Crea un objecte amb quatre valors numèrics i un objecte amb dos valors de caràcter.

    1. Fes servir la funció list() per crear un objecte que sigui una llista dels dos objectes uqe acabes de crear.
    2. Examina l’objecte llista que acabes de crear.
    3. Utiliza la funció names() per canviar els noms dels sub-objectes que composen la llista que acabes de crear.
    4. Examina la llista un altre cop.
  5. Crea un objecte que sigui la repetició (10 vegades) d’una seqüència numèrica de tots els nombres parells entre l’1 i el 50.