Objectes i funcions

L’objectiu d’aquesta secció és mostrar l’estructura bàsica de l’anàlisi de dades amb R. Principalment treballarem amb:

Objectes

Un objecte és qualsevol dada que tinguem emmagatzemada a dins d’R: des d’un sol nombre fins a milions de nombres i caràcters diferents. A continuació trobareu exemples de les diferents formes que pot prendre un objecte. Copieu el contingut de les següents caixes al vostre RStudio. Fixeu-vos que, a mida que anem prement CTRL+ENTER a cada línia de codi, els objectes ens van apareixent a la finestra d’Environment. Això significa que estem creant objectes nous que es van emmagatzemant a R. Si, un cop creat, introduïm el nom de l’objecte en una línia de codi i premem CTRL+ENTER, reproduirem el seu contingut, que ens apareixerà visible a la consola:

  • L’objecte tres pren la forma d’un nombre. El nombre 3.
tres <- 3
  • L’objecte operació també prendrà la forma d’un nombre, que és el resultat de sumar 7 i 5 i dividir el resultat entre dos. Com que R col·lapsa els resultats, a dins de l’objecte ho emmagatzemarà el número 6.
operacio <- (7 + 5) / 2
  • Utilitzem un objecte ja creat per fer una nova operació i ho guardem com a operacio_nova.
operacio_nova <- operacio * 3
  • L’objecte paisos emmagatzema un vector amb el nom de varis països. Crearem els vectors amb la funció c() i a dins hi ubicarem la cadena de valors. En aquest cas, enlloc de nombres, emmagatzemem caràcters. Per això n’hi direm el vector de caràcter.
paisos <- c("Alemanya", "Argentina", "Espanya", "Marroc", "Sudan")
  • L’objecte md_hdi emmagatzema un marc de dades. A dins del marc de dades hi ha quatre vectors diferents: el primer és un vector de caràcter, el segon és un vector numèric, el tercer és un vector enter i el darrer és un vector lògic.
md_hdi <- data.frame(pais = c("Alemanya", "Argentina", "Espanya", "Marroc", "Sudan"),
                     pnb = c(36.2, 15.5, 28.3, 10.2, 2.8), 
                     e_vida = c(78, 73, 79, 67, 54),
                     dem = c(TRUE, TRUE, TRUE, FALSE, FALSE))

Per visualitzar un objecte que hem creat només cal que teclegem el seu nom i premem CTRL+ENTER. A continuació visualitzem el marc de dades md_hdi.

paispnbe_vidadem
Alemanya36.278TRUE
Argentina15.573TRUE
Espanya28.379TRUE
Marroc10.267FALSE
Sudan2.854FALSE

Exercici 1: Fes les activitats i respon a les preguntes següents:

  • Prova de crear un objecte format per un vector de caràcter on hi figuri el teu nom.
  • Quina és la diferència entre el vector pnb i el vector e_vida?
  • Per què diries que el vector dem és TRUE algunes vegades i FALSE algunes altres? Quin significat té en relació als països del marc de dades?

Vectors

Un vector és una cadena de valors. Pot contenir des d’un sol valor fins a milions de valors. El creem de la següent manera:

c(valor1, valor2, valor3, ...)

Hi ha diferents tipus de valors que pot contenir un vector. Principalment en distingirem quatre: numèrics, enters, caràcters i lògics. Fixeu-vos en el codi següent.

  1. El vector numèric, format per nombres (poden acceptar decimals).
  2. El vector enter està format per nombres enters (no accepten decimals). Per tal que R sàpiga que són enters, col·locarem una L després de cada nombre.
  3. El vector de caràcter pot contenir tot tipus de valors: caràcters, números, símbols … Normalment hi emmagatzemarem caràcters. A l’hora de crear-lo posarem cada valor entre cometes.
  4. El vector lògic pot adoptar dos valors: TRUE o FALSE.
vector_numeric <- c(78.2, 56.3, 72.4, 64.6, 84.1)
vector_enter <- c(1L, 5L, 7L, 4L, 4L, 4L, 7L, 8L)
vector_caracter <- c("blau", "groc", "verd", "blau")
vector_logic <- c(TRUE, FALSE, FALSE, FALSE, TRUE)

És important recordar que un vector només pot emmagatzemar valors d’un sol tipus. És a dir, en un mateix vector, no podem tenir a la vegada valors numèrics i valors de caràcter, per exemple. Si ho fem, R ens coercionarà alguns valors.

Exercici 2. Coercions: En l’exemple següent hem provat d’emmagatzemar un vector amb diferents combinacions de valors.

  • Què creieu que passarà en cada cas?
  • Per saber la resposta, examineu de quin tipus i classe és cada vector amb typeof(nom_del_vector) o class(nom_del_vector). Com veureu, R converteix els elements del vector en valors d’un sol tipus.
  • Sabríeu intuir com decideix R aquesta conversió?
num_log <- c(34, TRUE)
car_log <- c("Hello", TRUE)
num_car <- c(34, "Hello")
num_car_log <- c(34, "Hello", TRUE)

Podeu ampliar la informació sobre els tipus de vectors i les coercions en aquest vídeo:

Font: Datacamp

Seleccionar elements d’un vector

Una manera de seleccionar1 els valors d’un vector és utilitzant els claudàtors [ ], que els situarem immediatament després del vector o de l’objecte que conté un vector.

  • A dins el claudàtor hi posarem un vector que indiqui la posició dels valors que volem que ens retorni del vector en qüestió.
  • Fixeu-vos que el símbol : és una drecera per marcar una cadena de nombres. Si marquem 1:3 serà com si demanéssim c(1,2,3) mentre que si marquem 10:20 ens serà com si demanéssim c(10,11,12,13,14,15,16,17,18,19,20).
vector_caracter[1:3]
vector_logic[c(2,4)]
vector_numeric[c(1:3,5)]
vector_enter[-c(5,8)]
## [1] "blau" "groc" "verd"
## [1] FALSE FALSE
## [1] 78.2 56.3 72.4 84.1
## [1] 1 5 7 4 4 7

Operacions amb un vector

Amb els vectors podem fer dos tipus d’operacions:

  • Vector amb un nombre.
nombre_per_vector <- 3 * c(3,4,5)
nombre_per_vector
## [1]  9 12 15
  • Operació d’un vector amb un altre vector d’igual longitud.
vector_per_vector <-c(3,4,5) * c(3,4,5)
vector_per_vector
## [1]  9 16 25

Marc de dades

Podem entendre un marc de dades com una agrupació de varis vectors d’igual longitud. El crearem amb la funció data.frame() (veure també les funcions tibble). Podem crear el marc de dades de dues maneres:

  • Creem primer els vectors i després els introduïm al marc de dades.
vector1 <- c("A", "B", "C")
vector2 <- c(1, 2, 3)
vector3 <- c(TRUE, TRUE, FALSE)
data.frame(vector1, vector2, vector3)
  • O bé indiquem el contingut dels vectors i el nom directament a dins la funció data.frame(), com veiem en el següent exemple, que li hem posat el nom de md_agr:
md_agr <- data.frame(pais = c("França", "França", "Regne Unit", "Regne Unit", 
                              "Polònia", "Polònia", "Congo", "Congo"), 
                     any = c(1980, 2010, 1980, 2010, 1980, 2010, 1980, 2010), 
                     dem = c(TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, FALSE, FALSE), 
                     pib_cap = c(12672.18, 40638.33, 10032.06, 38893.02, 5241.75,
                                 12597.86, 927.10, 2737.34), 
                     agr = c(56.8, 52.8, 76.8, 71.2, 64.5, 47.2, 30.8, 31), 
                     stringsAsFactors = FALSE)
paisanydempib_capagr
França1980TRUE12672.1856.8
França2010TRUE40638.3352.8
Regne Unit1980TRUE10032.0676.8
Regne Unit2010TRUE38893.0271.2
Polònia1980FALSE5241.7564.5
Polònia2010TRUE12597.8647.2
Congo1980FALSE927.1030.8
Congo2010FALSE2737.3431.0

Per visualitzar el contingut del marc de dades, podem simplement teclejar el nom del objecte on l’hem guardat o bé podem visualitzar-lo de forma vertical mitjançant la funció str(). La funció glimpse() del paquet dplyr ens ofereix una visualització semblant.

library(dplyr)
glimpse(md_agr)
## Rows: 8
## Columns: 5
## $ pais    <chr> "França", "França", "Regne Unit", "Regne Unit", "Polònia", "Po…
## $ any     <dbl> 1980, 2010, 1980, 2010, 1980, 2010, 1980, 2010
## $ dem     <lgl> TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, FALSE, FALSE
## $ pib_cap <dbl> 12672.18, 40638.33, 10032.06, 38893.02, 5241.75, 12597.86, 927…
## $ agr     <dbl> 56.8, 52.8, 76.8, 71.2, 64.5, 47.2, 30.8, 31.0

Els marcs de dades tibble

Una versió millorada dels marcs de dades són els tipus tibble. Per crear-los, tenim vàries maneres:

  • Aplicar la funció tibble() o la funció tbl_df() al marc de dades ja creat.
  • Crear el marc de dades directament amb la funció tibble() o la funció tbl_df().
  • També existeix la funció tribble(), que ens crea el marc de dades de forma vertical.
md_agr <- tbl_df(md_agr)
tribble(~country, ~year, ~number, 
        "Argentina", 1980, 2304, 
        "Brazil", 1990, 2045)

Seleccionar elements d’un marc de dades

Per seleccionar o extraure elements del marc de dades també utilitzarem els parèntesis, però en aquest cas sempre ubicarem una coma al mig [ , ]. A l’esquerra de la coma seleccionarem les files i a la dreta les columnes. Vegeu els següents exemples:

md_agr[3, ]
md_agr[2:4,c(1,4)]
md_agr[ ,-4]
md_agr[-c(2:4,6), "any"]
##         pais  any  dem  pib_cap  agr
## 3 Regne Unit 1980 TRUE 10032.06 76.8
##         pais  pib_cap
## 2     França 40638.33
## 3 Regne Unit 10032.06
## 4 Regne Unit 38893.02
##         pais  any   dem  agr
## 1     França 1980  TRUE 56.8
## 2     França 2010  TRUE 52.8
## 3 Regne Unit 1980  TRUE 76.8
## 4 Regne Unit 2010  TRUE 71.2
## 5    Polònia 1980 FALSE 64.5
## 6    Polònia 2010  TRUE 47.2
## 7      Congo 1980 FALSE 30.8
## 8      Congo 2010 FALSE 31.0
## [1] 1980 1980 1980 2010

Si volem canviar els títols de les columnes del marc de dades utilitzarem la funció names(), per exemple:

names(md_agr) <- c("País", "Any", "Dem", "PIB_cap", "Agr")
names(md_agr)[3] <- c("Democràcia")

Funcions

Una funció és una operació concreta que podem aplicar a un objecte determina. La lògica és relativament fàcil: suposem que volem crear una funció que es digui per_dos() que multipliqui per dos un vector determinat. La funció que crearíem és la següent:

per_dos <- function(x) {
  x * 2
}

Ara provem d’aplicar aquesta funció al vector_numèric que havíem creat anteriorment:

per_dos(vector_numeric)
## [1] 156.4 112.6 144.8 129.2 168.2

Com veieu, ens ha multiplicat per dos cada valor del vector_numèric. Això és el que fa una funció: una determinada operació a un objecte. Hi ha funcions molt senzilles, com la que acabem de crear, i funcions molt sofisticades. Vegem exemples d’altres funcions que podem aplicar als objectes que hem creat:

  • round(): Ens arrodoneix els decimals d’un vector.
  • sum(): Ens suma els valors d’un vector.
  • max(): Ens busca el valor màxim d’un vector.
  • length(): Ens conta el número de valors d’un vector.
round(vector_numeric)
## [1] 78 56 72 65 84
sum(c(5, 1, 9, 8, 2))
## [1] 25
max(vector_enter)
## [1] 8
length(vector_caracter)
## [1] 4

Utilitzar l’ajuda: És important que aprengueu a consultar el quadre d’ajuda per saber com utilitzar les funcions.

  • El quadre d’ajuda apareix quan introduiu el nom de la funció precedit pel símbol ?. Per exemple, ?sample.
  • També apareix mitjançant la funció help(), per exemple help(sample).
  • A internet també trobareu moltes pàgines amb informació útil sobre cada funció.

Hi ha milers de funcions. Una funció interessant és la funció sample(), que ens retorna valors de forma aleatòria.

sample(10)
sample(vector_numeric)
sample(10, 3)
##  [1]  4  6  7  9  1 10  3  5  2  8
## [1] 84.1 78.2 64.6 72.4 56.3
## [1] 4 3 1

Com que el resultat és aleatori, és probable que quan reproduïu el codi no us aparegui el mateix resultat. Reproduïu vàries vegades el codi. Veureu que el resultat canvia.

Arguments

Una funció pot tenir varis arguments. Els arguments són maneres diferents que té la funció de comportar-se. Dels arguments, hem de tenir en compte:

  • Ubicarem els arguments a dins la funció, separats per comes.
funcio(argument1, argument2, argument3, ...)
  • L’argument 1 acostuma a ser l’objecte al que volem aplicar l’operació.
  • Per saber els arguments d’una funció, el millor és mitjançant la funció args() o bé amb l’ajuda ?funció.
sample(x, size, replace = FALSE, prob = NULL)
  • No cal posar tots els arguments d’una funció quan la fem servir. Alguns arguments tenen associats un valor per defecte. Per exemple, a la funció sample() només cal que indiquem els dos primers arguments, x i size (a l’ajuda també ens diu que si només introduïm un valor, interpretarà que size tindrà la longitud d’x. Si no indiquem el contrari, l’argument replace serà FALSE i prob serà NULL.
  • Si alterem ordre dels arguments, haurem d’indicar expressament a quin ens referim en cada moment.

En l’exemple següent, hem fet diverses combinacions amb els arguments de la funció sample(). Intenteu interpretar-los:

sample(10, 3)
sample(size = 3, x = 10)
sample(vector_numeric, 2, TRUE, c(0.3, 0.1, 0.3, 0.2, 0.1))
sample(x = vector_numeric, size = 2, replace = TRUE, prob = c(0.3, 0.1, 0.3, 0.2, 0.1))
sample(replace = TRUE,size = 2, prob = c(0.3, 0.1, 0.3, 0.2, 0.1), x = vector_numeric)
## [1] 2 6 7
## [1]  3 10  6
## [1] 64.6 72.4
## [1] 84.1 72.4
## [1] 72.4 78.2

  1. També en podem dir ‘extraure’ els elements d’un vector↩︎

Next