Funcions bàsiques R (I)

Escenaris i usos del Big Data (UAB)

Author

Mireia Camacho

Aquest document engloba tant el codi com les explicacions de classe per a poder fer un bon seguiment de les funcions d’R així com possibles usos per a poder explorar i analitzar conjunts de dades.

library(tidyverse)

Treballarem amb el dataset IRIS (que ja ve integrat a R) per als exemples.

L’OPERADOR PIPE (%>%)

iris %>% 
  select(Sepal.Length, Species) %>% # Permet encadenar diferents funcions en un mateix paràgraf de codi.
  filter(Species == 'setosa') 

Sempre s’agafa el resultat de la línia anterior, de manera que si al select() no haguéssim inclòs la variable ‘Species’, ara no podríem filtrar-la.

SELECCIÓ DE VARIABLES

Per a seleccionar una variable d’un dataset encadenarem el nom del dataset i la variable amb el símbol del dòlar ($).

iris$Sepal.Length 
 [1] 5.1 4.9 4.7 4.6 5.0 5.4 4.6 5.0 4.4 4.9

També podem seleccionar la columna indicant la seva posició dins el dataset posant el número entre corxets [ ].

iris[3] 
   Petal.Length
1           1.4
2           1.4
3           1.3
4           1.5
5           1.4
6           1.7
7           1.4
8           1.5
9           1.4
10          1.5

Si volem seleccionar més d’una columna CORRELATIVA, podem posar els números de les posicions de les columnes separats per dos punts (:).

iris[1:3] # Selecciona des de la columna 1 fins a la 3.
   Sepal.Length Sepal.Width Petal.Length
1           5.1         3.5          1.4
2           4.9         3.0          1.4
3           4.7         3.2          1.3
4           4.6         3.1          1.5
5           5.0         3.6          1.4
6           5.4         3.9          1.7
7           4.6         3.4          1.4
8           5.0         3.4          1.5
9           4.4         2.9          1.4
10          4.9         3.1          1.5

SELECCIÓ DE FILES

De la mateixa manera que per a seleccionar columnes, les files també es poden seleccionar mitjançant corxets [ ]. La única diferència és que aquí caldrà especificar la posició fila-columna dins els corxets, separant els elements amb una coma. Si volem seleccionar totes les columnes, podem deixar l’espai rere la coma en blanc.

iris[2,] # Selecciona només la segona fila del dataset iris.
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
2          4.9           3          1.4         0.2  setosa
iris[2:5,] # Selecciona des de la segona fila fins a la cinquena.
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa

SELECCIÓ DE FILES I COLUMNES

Tenint en compte els punts anteriors, seleccionar files i columnes d’un dataframe resulta senzill i intuitiu. Si volguéssim seleccionar l’element que es troba a la 3a columna de la fila 10 només caldria executar el codi:

iris[10,3] # Selecció de la fila 10 i la columna 3.
[1] 1.5

De la mateixa manera que si volem seleccionar les files 20 a 25 de les columnes Sepal.Length i Sepal.Width només caldrà posar:

iris[20:25,1:2] # Selecció de les files 20 a 25 i les columnes 1 i 2.
   Sepal.Length Sepal.Width
20          5.1         3.8
21          5.4         3.4
22          5.1         3.7
23          4.6         3.6
24          5.1         3.3
25          4.8         3.4

Però què passa si volem seleccionar més d’una fila o més d’una columna que no són correlatives? Aleshores podem utilitzar la funció c().

iris[c(2,3,6),c(3,5)] # Selecció de les files 2, 3 i 6 i les columnes 3 i 5.
  Petal.Length Species
2          1.4  setosa
3          1.3  setosa
6          1.7  setosa
iris[c(2,15:20),c(1,3:5)] # Selecció de les files 2 i de la fila 15 a la 20; i les columnes 1 i de la 3 a la 5.
   Sepal.Length Petal.Length Petal.Width Species
2           4.9          1.4         0.2  setosa
15          5.8          1.2         0.2  setosa
16          5.7          1.5         0.4  setosa
17          5.4          1.3         0.4  setosa
18          5.1          1.4         0.3  setosa
19          5.7          1.7         0.3  setosa
20          5.1          1.5         0.3  setosa

LA FUNCIÓ HEAD()

La funció head() mostra les primeres files d’un dataset. Permet poder explorar les dades de forma superficial i àgil, ja que no necessita haver de carregar el dataset sencer.

head(iris) #Permet veure les primeres files del dataset i totes les columnes que el composen.
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa
head(iris, 10) #Podem especificar el nombre de files que volem que apareguin amb un segon argument a la funció.
   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1           5.1         3.5          1.4         0.2  setosa
2           4.9         3.0          1.4         0.2  setosa
3           4.7         3.2          1.3         0.2  setosa
4           4.6         3.1          1.5         0.2  setosa
5           5.0         3.6          1.4         0.2  setosa
6           5.4         3.9          1.7         0.4  setosa
7           4.6         3.4          1.4         0.3  setosa
8           5.0         3.4          1.5         0.2  setosa
9           4.4         2.9          1.4         0.2  setosa
10          4.9         3.1          1.5         0.1  setosa

LA FUNCIÓ UNIQUE()

La funció unique() mostra els valors únics d’una variable. S’utilitzen principalment per a comprovar els nivells d’una variable factor o de text, però també es pot utilitzar en variables numèriques. Com que necessita que li passem una variable, cal tenir en compte que donarà error si li intentem passar un dataset sencer.

unique(iris$Species) # Nivells únics que apareixen a la variable factor 'Species'.
[1] setosa     versicolor virginica 
Levels: setosa versicolor virginica
unique(iris$Sepal.Length) # Nombres únics que apareixen a la variable numèrica 'Sepal.Length'.
 [1] 5.1 4.9 4.7 4.6 5.0 5.4 4.4 4.8 4.3 5.8 5.7 5.2 5.5 4.5 5.3 7.0 6.4 6.9 6.5
[20] 6.3 6.6 5.9 6.0 6.1 5.6 6.7 6.2 6.8 7.1 7.6 7.3 7.2 7.7 7.4 7.9

LA FUNCIÓ STR()

str() (simplificat de ‘structure’) permet veure l’estructura del dataset amb un simple cop d’ull.

str(iris) 
'data.frame':   150 obs. of  5 variables:
 $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
 $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
 $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
 $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
 $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...

Compilar aquesta funció per al dataset iris ens mostra que ens trobem davant un objecte ‘data frame’ que compta amb 150 files (observacions) i 5 columnes (variables). També ens informa de que les 4 primeres variables són numèriques i que hi ha una 5a que és factor amb 3 nivells.

LA FUNCIÓ SUMMARY()

Si la funció str() mostra l’estructura del dataset en general, la funció summary() ens mostra informació sobre cadascuna de les variables que el conformen.

summary(iris) 
  Sepal.Length    Sepal.Width     Petal.Length    Petal.Width   
 Min.   :4.300   Min.   :2.000   Min.   :1.000   Min.   :0.100  
 1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.600   1st Qu.:0.300  
 Median :5.800   Median :3.000   Median :4.350   Median :1.300  
 Mean   :5.843   Mean   :3.057   Mean   :3.758   Mean   :1.199  
 3rd Qu.:6.400   3rd Qu.:3.300   3rd Qu.:5.100   3rd Qu.:1.800  
 Max.   :7.900   Max.   :4.400   Max.   :6.900   Max.   :2.500  
       Species  
 setosa    :50  
 versicolor:50  
 virginica :50  
                
                
                

En el cas de les variables numèriques se’ns mostra quins són els nombres mínims i màxims, quina és la mitjana i quina la mediana i també els quartils 1 i 3. D’aquesta manera podem analitzar sense gaire esforç quina és la distribució dels números. Per exemple, a la variable ‘Sepal.Width’ el mínim és 2 i el màxim és 4,4. Tant la mitjana com la mediana estan situades al 3, per la qual cosa podem veure que existeix una distribució bastant uniforme entre els números de la variable.

En el cas de la variable factor ‘Species’, se’ns indica que hi ha 3 nivells: setosa, versicolor i virginica; i que cadascuna d’elles apareix al dataset en 50 files.

LA FUNCIÓ SELECT()

La funció select() permet, com indica el seu nom, seleccionar les columnes del dataset amb les quals volem treballar. Aquesta funció és especialment útil quan treballem amb bases de dades que tenen moltes variables o quan treballem amb bases de dades molt grans, ja que d’aquesta manera podem reduïr el nombre de columnes que s’hauran de processar cada cop que compilem el codi.

select() és molt versàtil i es pot utilitzar de la forma que més ens convingui, posant els noms de les variables o les seves posicions dins el dataframe:

iris %>% 
  select(Sepal.Length, Sepal.Width) # Podem passar els noms de les variables que volem seleccionar.

iris %>% 
  select(1,2) # Podem posar el número amb la posició de la columna dins el dataset.

iris %>% 
  select(1:3) # Podem especificar seleccionar diverses variables correlatives segons la seva posició (selecciona des de la columna 1 a la 3).

iris %>% 
  select(Sepal.Length:Petal.Length) # O també podem seleccionar variables correlatives pel nom de la variable.

iris %>% 
  select(-Sepal.Length) # Podem indicar que volem seleccionar totes les variables excepte una posant un guió (-) davant el nom de la variable.

iris %>% 
  select(-c(Sepal.Length, Petal.Length)) # Per a eliminar més d'una variable, només cal insertar-les dins la funció c(). Assegura't de que el guió estigui FORA de la funció c().

A banda de seleccionar les variables una per una, existeixen diverses funcions que permeten seleccionar les variables segons el seu nom. Aquestes funcions pertanyen a la llibreria Tidyselect, per tant, abans d’utilitzar-les carregarem la llibreria.

library(tidyselect)

Afegir la funció starts_with() dins de select() permet trobar les variables que comencin amb una cadena de text concreta que li especifiquem.

iris %>% 
  select(starts_with("Sepal")) # Només volem seleccionar les variables que comencin per 'Sepal'.
  Sepal.Length Sepal.Width
1          5.1         3.5
2          4.9         3.0
3          4.7         3.2
4          4.6         3.1
5          5.0         3.6

Pel contrari, si necessitem seleccionar les variables que acabin amb algun patró concret, podem utilitzar la funció ends_with().

iris %>% 
  select(ends_with("Length")) # Només volem seleccionar les variables que acabin amb 'Length'.
  Sepal.Length Petal.Length
1          5.1          1.4
2          4.9          1.4
3          4.7          1.3
4          4.6          1.5
5          5.0          1.4

Però què passa si necessitem seleccionar variables que no tenen el patró comú ni al principi ni al final del nom? Aleshores necessitarem la funció contains()

iris %>% 
  select(contains("al")) # Tant 'SepAL' com 'petAL' contenen el patró de text 'AL'.
  Sepal.Length Sepal.Width Petal.Length Petal.Width
1          5.1         3.5          1.4         0.2
2          4.9         3.0          1.4         0.2
3          4.7         3.2          1.3         0.2
4          4.6         3.1          1.5         0.2
5          5.0         3.6          1.4         0.2

LA FUNCIÓ FILTER()

filter() permet filtrar les files del dataset amb el qual estem treballant segons les condicions que li especifiquem.

iris %>% 
  filter(Sepal.Length == 6) %>% # Filtra per les files en què Sepal.length sigui 6. ATENCIÓ AL DOBLE ==!!
  head(5) # Mostra només les 5 primeres files.
  Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
1            6         2.2          4.0         1.0 versicolor
2            6         2.9          4.5         1.5 versicolor
3            6         2.7          5.1         1.6 versicolor
4            6         3.4          4.5         1.6 versicolor
5            6         2.2          5.0         1.5  virginica

Podem especificar més d’una condició dins els filtres. Per dir que volem NOMÉS les files que compleixin les condicions que hem afegit, utilitzarem l’operador &, que fa referència a la conjunció ‘i’.

iris %>% 
  filter(Sepal.Length == 6 & Petal.Width <= 3) %>% # Filtra per les files en què Sepal.length sigui 6 I Petal.Width sigui menor o igual que 3.
  head(5) # Mostra només les 5 primeres files.
  Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
1            6         2.2          4.0         1.0 versicolor
2            6         2.9          4.5         1.5 versicolor
3            6         2.7          5.1         1.6 versicolor
4            6         3.4          4.5         1.6 versicolor
5            6         2.2          5.0         1.5  virginica

També podem afegir diverses condicions però voler que se’ns retornin les files que ALMENYS compleixin una d’elles. Per a això utilitzarem l’operador | , que fa referència a la conjunció ‘o’. (El símbol | es troba a la tecla del número 1 del teclat).

iris %>% 
  filter(Sepal.Length == 6 | Species == 'versicolor') %>% # Filtra per les files en què Sepal.length sigui 6 O l'espècie sigui Versicolor.
  head(5) # Mostra només les 5 primeres files.
  Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
1          7.0         3.2          4.7         1.4 versicolor
2          6.4         3.2          4.5         1.5 versicolor
3          6.9         3.1          4.9         1.5 versicolor
4          5.5         2.3          4.0         1.3 versicolor
5          6.5         2.8          4.6         1.5 versicolor

LA FUNCIÓ MUTATE()

mutate() permet modificar el contingut d’una columna conservant el mateix nom o crear una columna nova a partir de les necessitats que li especifiquem. Primer especifiquem el nom de la variable amb que volem treballar. Si el nom ja es troba al dataset, es sobreescriurà amb les noves condicions que li diguem. Si el nom de la nova variable no existeix, es crearà una nova columna.

  • Noteu que, a diferència del que hem aplicat a la funció filter(), aquí només s’utilitza un únic signe d’igual (=).
iris %>% 
  mutate(Sepal.Length = 'floretes') # Sobreescrvim la variable Sepal.Length per a que a totes les files hi digui 'floretes'.
   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1      floretes         3.5          1.4         0.2  setosa
2      floretes         3.0          1.4         0.2  setosa
3      floretes         3.2          1.3         0.2  setosa
4      floretes         3.1          1.5         0.2  setosa
5      floretes         3.6          1.4         0.2  setosa
6      floretes         3.9          1.7         0.4  setosa
7      floretes         3.4          1.4         0.3  setosa
8      floretes         3.4          1.5         0.2  setosa
9      floretes         2.9          1.4         0.2  setosa
10     floretes         3.1          1.5         0.1  setosa
iris %>% 
  mutate(Nova_columna = Sepal.Length + Petal.Length) # Creem una nova columna on el contingut sigui la suma de Sepal.Length + Petal.Length per a cada fila.
   Sepal.Length Sepal.Width Petal.Length Petal.Width Species Nova_columna
1           5.1         3.5          1.4         0.2  setosa          6.5
2           4.9         3.0          1.4         0.2  setosa          6.3
3           4.7         3.2          1.3         0.2  setosa          6.0
4           4.6         3.1          1.5         0.2  setosa          6.1
5           5.0         3.6          1.4         0.2  setosa          6.4
6           5.4         3.9          1.7         0.4  setosa          7.1
7           4.6         3.4          1.4         0.3  setosa          6.0
8           5.0         3.4          1.5         0.2  setosa          6.5
9           4.4         2.9          1.4         0.2  setosa          5.8
10          4.9         3.1          1.5         0.1  setosa          6.4

També podem canviar el tipus de la variable amb les funcions as.character(), as.numeric(), as.Date(), as.factor()…

iris %>% 
  mutate(Sepal.Length = as.character(Sepal.Length)) %>% # Sobreescrivim la variable Sepal.Lenght amb una versió de sí mateixa però en format de text.
  str()
'data.frame':   150 obs. of  5 variables:
 $ Sepal.Length: chr  "5.1" "4.9" "4.7" "4.6" ...
 $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
 $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
 $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
 $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...

MUTATE() SEGONS CONDICIONS

Si la nova variable que volem crear amb mutate() depèn del contingut d’una altra columna, podem utilitzar la funció case_when() per fixar les condicions que s’han de complir perquè el contingut de la nova columna sigui un o un altre.

Podem fixar tantes condicions com volguem, assegurant-nos que estiguin separades per una coma.

  • Per a separar la condició del resulat que volem, utilitzarem el símbol ~ . (A Mac està pressionant Alt+Ñ i a Windows Alt+4).
iris %>% 
  mutate(Nova_columna = case_when(
    Sepal.Length <= 5 ~ "Sepal petit", # "Si Sepal.Length és menor o igual que 4, a la nova columna em posaràs "Sepal petit"."
    TRUE ~ "Sepal gran"                # El "TRUE", en aquest context significa "la resta", tot el que no coincideixi amb les condicions que haguem especificat anteriorment.
  )) %>% 
  head(10)
   Sepal.Length Sepal.Width Petal.Length Petal.Width Species Nova_columna
1           5.1         3.5          1.4         0.2  setosa   Sepal gran
2           4.9         3.0          1.4         0.2  setosa  Sepal petit
3           4.7         3.2          1.3         0.2  setosa  Sepal petit
4           4.6         3.1          1.5         0.2  setosa  Sepal petit
5           5.0         3.6          1.4         0.2  setosa  Sepal petit
6           5.4         3.9          1.7         0.4  setosa   Sepal gran
7           4.6         3.4          1.4         0.3  setosa  Sepal petit
8           5.0         3.4          1.5         0.2  setosa  Sepal petit
9           4.4         2.9          1.4         0.2  setosa  Sepal petit
10          4.9         3.1          1.5         0.1  setosa  Sepal petit

També es poden posar altres variables i operacions com a resultat de les condicions.

iris %>% 
  mutate(Nova_columna = case_when(
    Species == 'versicolor' ~ Sepal.Length, # Si l'espècie de la flor és 'versicolor', a la nova columna em poses el valor que tingui com a Sepal.Length.
    TRUE ~ Sepal.Width               # Per a les espècies que NO són 'versicolor', em poses el valor que tinguin a la columna Sepal.Width.
  )) %>% 
  head(10)
   Sepal.Length Sepal.Width Petal.Length Petal.Width Species Nova_columna
1           5.1         3.5          1.4         0.2  setosa          3.5
2           4.9         3.0          1.4         0.2  setosa          3.0
3           4.7         3.2          1.3         0.2  setosa          3.2
4           4.6         3.1          1.5         0.2  setosa          3.1
5           5.0         3.6          1.4         0.2  setosa          3.6
6           5.4         3.9          1.7         0.4  setosa          3.9
7           4.6         3.4          1.4         0.3  setosa          3.4
8           5.0         3.4          1.5         0.2  setosa          3.4
9           4.4         2.9          1.4         0.2  setosa          2.9
10          4.9         3.1          1.5         0.1  setosa          3.1