7  Selecció d’objectes

7.1 Introducció

Normalment amb R treballarem amb marcs de dades de grans dimensions, però sovint ens pot interessar només una petita part de les dades. Per exemple, imaginem que ens descarreguem una base de dades que conté informació sobre diversos països però que només ens interessa la que està relacionada amb Espanya.

Per a aquest tipus d’operacions ens aniran molt bé els claudàtors [ ]. Els claudàtors es posen just després de l’objecte en qüestió i ens permeten seleccionar una part de les dades d’aquest objecte. El seu funcionament és una mica diferent si els utilitzem per seleccionar elements d’un vector o elements d’un marc de dades.

objecte[ ]

7.2 Selecció de vectors

Per seleccionar els elements d’un vector, posarem els claudàtors just després del vector. A dins dels claudàtors, posarem o bé un vector numèric o bé un vector lògic indicant els valors que seleccionem:

vector[vector_numeric]
vector[vector_logic]

A continuació veiem exemples de com seleccionar parts d’un vector mitjançant un vector numèric o un vector lògic.

Posarem un vector numèric que indiqui la posició dels elements que es vol conservar. Per exemple:

  • Seleccionem el primer i el tercer valor del vector elections$country.
elections$country[c(1,3)]
## [1] "Colombia" "Germany"
  • Seleccionem del segon al cinquè valor del vector elections$country.
elections$country[2:5]
## [1] "Japan"       "Germany"     "Chile"       "New Zealand"
  • Seleccionem tots els valors menys el tercer del vector elections$country amb el símbol negatiu abans del vector.
elections$country[-c(3)]
## [1] "Colombia"    "Japan"       "Chile"       "New Zealand"

Podem posar un vector lògic d’igual longitud al vector original que indiqui amb TRUE els elements que es vol seleccionar. Per exemple:

  • Seleccionem el segon i el quart valor del vector elections$country.
elections$country[c(FALSE, TRUE, FALSE, TRUE, FALSE)]
## [1] "Japan" "Chile"
  • Utilitzem un vector lògic ja existent per seleccionar els elements que volem. En aquest cas, seleccionem els països de elections$country que tenen eleccions presidencials amb el vector elections$presidential.
elections$country[elections$presidential]
## [1] "Colombia" "Chile"

Vegeu més avall el subapartat El poder dels vectors lògics per saber-ne més sobre com utilitzar vectors lògics per seleccionar elements d’objectes.

7.3 Selecció de marcs de dades

Per seleccionar els elements d’un marc de dades, posarem els claudàtors just després del marc de dades. A dins dels claudàtors hi situarem una coma:

  • A l’esquerra de la coma hi indicarem les files amb un vector numèric o lògic.
  • A la dreta de la coma hi indicarem les columnes amb un vector numèric o de caràcter.
  • Si a un costat de la coma no donem cap indicació, ens retornarà totes les files o totes les columnes segons correspongui.
marcdades[files,columnes]

Vegem alguns exemples, utilitzant el marc de dades elections:

Seleccionem de la primera a la tercera fila, deixem les columnes en blanc.

elections[1:3, ]
## # A tibble: 3 × 6
##   country   year date       turnout continent presidential
##   <chr>    <int> <date>       <dbl> <fct>     <lgl>       
## 1 Colombia  2022 2022-05-29    55.0 America   TRUE        
## 2 Japan     2021 2021-10-31    56.0 Asia      FALSE       
## 3 Germany   2021 2021-09-26    76.6 Europe    FALSE

Seleccionem la segona i la cinquena fila i de la primera a la quarta columna.

elections[c(2,5), 1:4]
## # A tibble: 2 × 4
##   country      year date       turnout
##   <chr>       <int> <date>       <dbl>
## 1 Japan        2021 2021-10-31    56.0
## 2 New Zealand  2020 2020-10-17    82.2

Seleccionem les files que tenen eleccions presidencials i eliminem la segona i sisena columna amb el símbol negatiu.

elections[elections$presidential, -c(2,6)]
## # A tibble: 2 × 4
##   country  date       turnout continent
##   <chr>    <date>       <dbl> <fct>    
## 1 Colombia 2022-05-29    55.0 America  
## 2 Chile    2021-11-21    47.3 America

En el cas de les columnes, també podem introduir un vector amb el nom de les columnes que volem seleccionar.

elections[c(1:3), c("country","presidential")]
## # A tibble: 3 × 2
##   country  presidential
##   <chr>    <lgl>       
## 1 Colombia TRUE        
## 2 Japan    FALSE       
## 3 Germany  FALSE
  • També podem utilitzar el vector lògic elections$presidential, que ens conservarà les files que són TRUE.
elections[elections$presidential,]
## # A tibble: 2 × 6
##   country   year date       turnout continent presidential
##   <chr>    <int> <date>       <dbl> <fct>     <lgl>       
## 1 Colombia  2022 2022-05-29    55.0 America   TRUE        
## 2 Chile     2021 2021-11-21    47.3 America   TRUE

Cal recordar que per guardar els canvis haurem de crear un nou objecte. En cas contrari, només ho visualitzem a la consola però no ens queda guardat a l’Environment.

El poder dels vectors lògics

Els vectors lògics són una eina importantíssima per seleccionar (més endavant en direm ‘filtrar’) marcs de dades. Per què ens seran de tanta utilitat? Doncs perquè ens permeten seleccionar els casos que ens interessen d’una manera molt ràpida.

Per exemple, en el següent codi hem descarregat una base de dades dels partits polítics d’Amèrica Llatina. Però resulta que només ens interessen els partits polítics brasilers. Doncs podem fer el següent:

  • Descarreguem la base de dades i el convertim en l’objecte ches_la.
library(dplyr)
library(readr)
ches_la <- read_csv("https://www.chesdata.eu/s/ches_la_2020_aggregate_level_v01.csv")
  • Consultem la llista de variables. Observem que hi ha el vector country.
glimpse(ches_la)
  • Comprovem els noms únics del vector country.
unique(ches_la$country)
##  [1] "Argentina"  "Bolivia"    "Brasil"     "Chile"      "Colombia"  
##  [6] "Costa Rica" "Ecuador"    "M\xe9xico"  "Paraguay"   "Per\xfa"   
## [11] "Uruguay"    "Venezuela"
  • Efectivament, trobem Brasil entre els països dels quals tenim dades. Ara només hem de crear un vector lògic que marqui TRUE les observacions de Brasil i situar aquest vector entre claudàtors.
ches_br <- ches_la[ches_la$country == "Brasil", ]
ches_br
## # A tibble: 12 × 60
##     ...1 country_id country_abb country country_en party_id party_abb party     
##    <dbl>      <dbl> <chr>       <chr>   <chr>         <dbl> <chr>     <chr>     
##  1    14         52 BR          Brasil  Brazil         5201 PT        "Partido …
##  2    15         52 BR          Brasil  Brazil         5202 PSL       "Partido …
##  3    16         52 BR          Brasil  Brazil         5203 PP        "Partido …
##  4    17         52 BR          Brasil  Brazil         5204 PSD       "Partido …
##  5    18         52 BR          Brasil  Brazil         5205 MDB       "Moviment…
##  6    19         52 BR          Brasil  Brazil         5206 PR        "Partido …
##  7    20         52 BR          Brasil  Brazil         5207 PS        "Partido …
##  8    21         52 BR          Brasil  Brazil         5208 PRB       "Partido …
##  9    22         52 BR          Brasil  Brazil         5209 PSDB      "Partido …
## 10    23         52 BR          Brasil  Brazil         5210 DEM       "Democrat…
## 11    24         52 BR          Brasil  Brazil         5211 PDT       "Partido …
## 12    25         52 BR          Brasil  Brazil         5212 JB        "Jair Bol…
## # ℹ 52 more variables: party_en <chr>, president <dbl>, wave <dbl>,
## #   lrecon <dbl>, lrecon_blur <dbl>, lrecon_dissent <dbl>,
## #   lrecon_salience <dbl>, galtan <dbl>, galtan_blur <dbl>,
## #   galtan_dissent <dbl>, galtan_salience <dbl>, lrgen <dbl>, covid_ec <dbl>,
## #   covid_ex <dbl>, immigrate_policy <dbl>, immigrate_salience <dbl>,
## #   redistribution <dbl>, redist_salience <dbl>, environment <dbl>,
## #   enviro_salience <dbl>, spendvtax <dbl>, spendvtax_salience <dbl>, …

L’operació lògica ha retornat 12 valors com a TRUE. Gràcies a aquesta operació, hem reduït la base de dades a només aquells valors de la columna country que coincidien amb el valor Brasil. A la dreta de la coma, podríem posar-hi un vector numèric per eliminar les cinc primeres columnes que, com que fan referència al país, ja no ens interessen.

Exercici 7.1 (Selecció objectes) Practica aquí el que has après en aquesta secció. Recorda que no cal utilitzar R per realitzar els exercicis.