Post on 28-May-2020
Taller introduccio a RPart I
Joan Manel Sanchez Grinojmsanchez@pisunyer.org
25 abril 2013
Index
1 Caracterıstiques generals del programariOrıgensPrincipals caracterıstiquesAjuda i documentacio
2 Funcionalitats basiquesInstal·lacioEspais de treball, objectes i paquetsExecucio d’instruccionsGUIs i IDEs
3 Tractament de fitxers i transformacio de dadesCarrega de dadesFuncions basiquesTransformacio de dades
4 Analisi de dadesProcediments d’analisiEls grafics en R
Introduccio a R. 2 de 64
Caracterıstiques generals del programari
Introduccio a R. 3 de 64
Orıgens
Introduccio a R. 4 de 64
Orıgens
1992 Aukland, Nova Zelanda: Ross Ihaka i Robert Gentleman
Implementacio del llenguatge “S”
1993 primeres distribucions a la xarxa
1995 pren forma amb la llicenca GPL
1997 R Core Development Team
2002 R Foundation for Statistical Computing
Introduccio a R. 5 de 64
Principals caracterıstiques
Introduccio a R. 6 de 64
Principals caracterıstiques
Gratuıt
Llenguatge i entorn per la computacio estadıstica i grafica
Motor lleuger amb la possibilitat d’utilitzar diferents interficies
Dirigit a objectes
Versatilitat i ductilitat
Utilitzacio de
Calculs basics (calculadora)Funcions existentsFuncions programades ad-hoc
Carrega de paquets (amb les funcions) segons les necessitats
Introduccio a R. 7 de 64
Ajuda i documentacio
Introduccio a R. 8 de 64
Ajuda i documentacio
Ajuda i documentacio oficial
?, help(), help.search()Documentacio dels paquets
Grups d’usuaris
R Users Grup Barcelona http://rugbcn.wordpress.com/
Blocs, forums i llocs web de suport
R-bloggers http://www.r-bloggers.com/
Llistes de correu electronic de suport
R-help-eshttps://stat.ethz.ch/mailman/listinfo/r-help-es
Introduccio a R. 9 de 64
Pagina d’ajuda de funcions
Introduccio a R. 10 de 64
Funcionalitats basiques
Introduccio a R. 11 de 64
Instal·lacio
Introduccio a R. 12 de 64
Instal·lacio
Introduccio a R. 13 de 64
Instal·lacio
Introduccio a R. 13 de 64
Instal·lacio
Introduccio a R. 13 de 64
Instal·lacio
Windows
Descarregar baseInstal·lar
Linux
(actualitzacions automatiques) Afegir l’adreca de la font deprogramari (veure web)(actualitzacions automatiques) Afegir la clau publica (veureweb)Cercar “r-base” al centre de programari o teclejar al terminal“sudo apt-get install r-base”
Mac OS
Descarregar ultima versio disponibleInstal·lar
Alternativa: descarregar paquets preparats R + GUI/IDE
Introduccio a R. 14 de 64
Espais de treball, objectes i paquets
Introduccio a R. 15 de 64
Working directory
Es el directori de treball, on R cerca els fitxers externs si nos’especifica una altra cosa.
getwd()
setwd()
Introduccio a R. 16 de 64
workspace
L’espai de treball, workspace, es l’entorn de R en el que es treballadurant una sessio i conte tots els objectes definits per l’usuari.
No ha de ser definit per l’usuari, es genera en cada sessio
Es pot desar: save.image()
Coneixer els objectes: ls()
Classe: class()
Introduccio a R. 17 de 64
Objectes
Vectors: seguit de valors d’un mateix tipus, ja sigui numerics,logics o caracter, amb una dimensio i una longitud determinada
unvector
## [1] 2 5 3 66 4 87
Factors: vectors que contenen variables categoriques, amb unatribut de nivells que son les categories. Els nivells o categories esconeixen amb la funcio levels()
unfactor
## [1] Primer Tercer Segon Primer Primer Tercer
## Levels: Primer Segon Tercer
Introduccio a R. 18 de 64
Objectes
Matrius son objectes de dues dimensions, amb fileres i columnes,que contenen valors d’un mateix tipus
unamatriu
## [,1] [,2]
## [1,] 1 6
## [2,] 2 7
## [3,] 3 8
## [4,] 4 9
## [5,] 5 10
Introduccio a R. 19 de 64
Objectes
Data.frame es el que anomenem matriu de dades. Tenen duesdimensions que poden contenir dades de diferents tipus. Lescolumnes son les variables, i cada variable pot ser de diferentsclasses. A les fileres tenim els individus
undataframe
## nom sexe edat pes
## 1 Arnau H 28 67.9
## 2 Vıctor H 32 59.6
## 3 Martı H 30 85.5
## 4 Pau H 32 66.5
## 5 Pol H 30 56.6
## 6 Berta D 30 61.4
## 7 Julia D 32 67.9
## 8 Paula D 29 74.0
Introduccio a R. 20 de 64
Objectes
Llistes son un conjunt d’objectes, que poden ser iguals o diferents,i que poden tenir diferents dimensions i tipus de dades
unallista
## [[1]]
## [1] 2 5 3 66 4 87
##
## [[2]]
## [1] Primer Tercer Segon Primer Primer Tercer
## Levels: Primer Segon Tercer
##
## [[3]]
## [,1] [,2]
## [1,] 1 6
## [2,] 2 7
## [3,] 3 8
## [4,] 4 9
## [5,] 5 10
##
## [[4]]
## nom sexe edat pes
## 1 Arnau H 28 67.9
## 2 Vıctor H 32 59.6
## 3 Martı H 30 85.5
## 4 Pau H 32 66.5
## 5 Pol H 30 56.6
## 6 Berta D 30 61.4
## 7 Julia D 32 67.9
## 8 Paula D 29 74.0 Introduccio a R. 21 de 64
Paquets
search()
install.packages()
library(), require()
Introduccio a R. 22 de 64
Execucio d’instruccions
Introduccio a R. 23 de 64
Objecte vs funcio
Referenciar objecte
Escriure el nom1 dimensio: posicio del valor entre claudators [ ]2 dimensions: posicio de les fileres, de les columnes entreclaudators [fileres,columnes]Variable en data.frame: “ $ ” entre nom objecte i nom variable
Utilitzar funcio
Sempre amb parentesi al final()Entre els parentesi els argumentsNo modifica els objectes si no es fa expressament
Introduccio a R. 24 de 64
Calculadora
1+2
## [1] 3
3*4
## [1] 12
25+(235/6)
## [1] 64.17
Introduccio a R. 25 de 64
Operadors
Sımbol Descripcio
# Comentari, utilitzat per escriure comentarisen els scripts. Tot el que estigui al seu dar-rera en una mateixa lınia no sera processatper la consola
= Igual, utilitzat en algunes funcions i per es-pecificar valors de les opcions
== Igual, utilitzat en les avaluacions logiques←→ Igual, utilitzat per atorgar un valor a un ob-
jecte!= Diferent, o no igual& I| O
Introduccio a R. 26 de 64
Generar objectes
a <- c(1,3,2,1,1,3)
a
## [1] 1 3 2 1 1 3
b <- factor(a)
b
## [1] 1 3 2 1 1 3
## Levels: 1 2 3
levels(b) <- c("Primer","Segon","Tercer")
b
## [1] Primer Tercer Segon Primer Primer Tercer
## Levels: Primer Segon Tercer
Introduccio a R. 27 de 64
Generar objectes
1:10 -> c
c
## [1] 1 2 3 4 5 6 7 8 9 10
d = letters[1:5]
d
## [1] "a" "b" "c" "d" "e"
Introduccio a R. 28 de 64
Generar objectes
e <- data.frame(nom=c("Arnau","Pol","Berta","Julia"),
sexe=c(rep("H",2),rep("D",2)),
edat=round(rnorm(n=4,mean=30)),
pes=round(rnorm(n=4,mean=70,sd=12),1))
e
## nom sexe edat pes
## 1 Arnau H 30 67.8
## 2 Pol H 31 76.4
## 3 Berta D 30 62.7
## 4 Julia D 31 59.2
Introduccio a R. 29 de 64
Generar objectes
f <- list(a,b,e)
f
## [[1]]
## [1] 1 3 2 1 1 3
##
## [[2]]
## [1] Primer Tercer Segon Primer Primer Tercer
## Levels: Primer Segon Tercer
##
## [[3]]
## nom sexe edat pes
## 1 Arnau H 30 67.8
## 2 Pol H 31 76.4
## 3 Berta D 30 62.7
## 4 Julia D 31 59.2
Introduccio a R. 30 de 64
Referenciar objectes
a[3]
## [1] 2
b[2]
## [1] Tercer
## Levels: Primer Segon Tercer
Introduccio a R. 31 de 64
Referenciar objectes
e[3,]
## nom sexe edat pes
## 3 Berta D 30 62.7
e[e$nom=="Berta","edat"]
## [1] 30
Introduccio a R. 32 de 64
Referenciar objectes
f[1]
## [[1]]
## [1] 1 3 2 1 1 3
f[[1]]
## [1] 1 3 2 1 1 3
f[[3]][,1]
## [1] Arnau Pol Berta Julia
## Levels: Arnau Berta Julia Pol
Introduccio a R. 33 de 64
GUIs i IDEs
Introduccio a R. 34 de 64
GUIs i IDEs
http://www.sciviews.org/Tinn-R/
Introduccio a R. 35 de 64
Tractament de fitxers i transformacio de dades
Introduccio a R. 36 de 64
Carrega de dades
Introduccio a R. 37 de 64
Carregar dades csv: read.table()
args(read.table)
## function (file, header = FALSE, sep = "", quote = "\"'", dec = ".",
## row.names, col.names, as.is = !stringsAsFactors, na.strings = "NA",
## colClasses = NA, nrows = -1, skip = 0, check.names = TRUE,
## fill = !blank.lines.skip, strip.white = FALSE, blank.lines.skip = TRUE,
## comment.char = "#", allowEscapes = FALSE, flush = FALSE,
## stringsAsFactors = default.stringsAsFactors(), fileEncoding = "",
## encoding = "unknown", text)
## NULL
dades.gencat <- read.csv2(
"http://www.gencat.cat/opendata/recursos/eleccions/pc/OPENDATA_A2012_participacio.csv",
fileEncoding="CP1252")
Introduccio a R. 38 de 64
Carregar dades sav: read.spss()
library(foreign)
args(read.spss)
## function (file, use.value.labels = TRUE, to.data.frame = FALSE,
## max.value.labels = Inf, trim.factor.names = FALSE, trim_values = TRUE,
## reencode = NA, use.missings = to.data.frame)
## NULL
dades.spss <- read.spss("GSS1993.sav",to.data.frame=T)
Introduccio a R. 39 de 64
Funcions basiques
Introduccio a R. 40 de 64
Funcions basiques
Descripcio d’un data.frame
str(dades.gencat)
## 'data.frame': 1009 obs. of 25 variables:
## $ ELECCIO : Factor w/ 2 levels "","A": 2 2 2 2 2 2 2 2 2 2 ...
## $ ANY : int 2012 2012 2012 2012 2012 2012 2012 2012 2012 2012 ...
## $ NIVELL : Factor w/ 6 levels "","CA","CO","DM",..: 2 3 3 3 3 3 3 3 3 3 ...
## $ AUTONOMIA : Factor w/ 2 levels "","Catalunya": 2 2 2 2 2 2 2 2 2 2 ...
## $ CODI.PROVINCIA : int NA NA NA NA NA NA NA NA NA NA ...
## $ PROVINCIA : Factor w/ 5 levels "","Barcelona",..: 1 1 1 1 1 1 1 1 1 1 ...
## $ CODI.COMARCA : int NA 1 2 3 4 5 6 7 8 9 ...
## $ COMARCA : Factor w/ 43 levels "","Alta Ribagorca",..: 1 3 4 5 6 2 7 8 9 10 ...
## $ CODI.MUNICIPI : int NA NA NA NA NA NA NA NA NA NA ...
## $ MUNICIPI : Factor w/ 950 levels "","Abella de la Conca ",..: 1 1 1 1 1 1 1 1 1 1 ...
## $ CODI.DISTRICTE : int NA NA NA NA NA NA NA NA NA NA ...
## $ DISTRICTE : Factor w/ 11 levels "","Ciutat Vella ",..: 1 1 1 1 1 1 1 1 1 1 ...
## $ CENS.ELECTORAL : Factor w/ 841 levels "100.725","1.008",..: 619 440 782 749 172 416 795 116 93 623 ...
## $ VOTANTS : Factor w/ 793 levels "100","1.002",..: 454 281 601 593 23 249 624 780 732 440 ...
## $ X..VOTANTS : num 67.8 69.2 68.1 73 68.4 ...
## $ ABSTENCIO : Factor w/ 631 levels "","10","100",..: 159 625 282 205 452 626 281 390 406 198 ...
## $ X..ABSTENCIO : num 32.2 30.8 31.9 26.9 31.6 ...
## $ VOTS.NULS : Factor w/ 181 levels "","0","1","10",..: 89 49 105 130 29 92 127 159 157 146 ...
## $ X..VOTS.NULS : num 0.9 0.86 0.72 1.04 1.24 1.74 0.92 0.84 0.91 1.98 ...
## $ VOTS.EN.BLANC : Factor w/ 215 levels "","0","1","10",..: 150 112 181 175 59 136 5 30 29 199 ...
## $ X..VOTS.EN.BLANC : num 1.44 1.5 1.28 1.23 1.59 2.24 1.69 1.43 1.59 2.51 ...
## $ VOTS.A.CANDIDATURES : Factor w/ 796 levels "","100","1.001",..: 438 277 593 581 14 233 612 773 726 415 ...
## $ X..VOTS.A.CANDIDATURES: num 97.7 97.6 98 97.7 97.2 ...
## $ VOTS.VALIDS : Factor w/ 797 levels "","100","1.000",..: 446 278 598 584 19 239 618 783 736 426 ...
## $ X..VOTS.VALIDS : num 99.1 99.1 99.3 99 98.8 ...Introduccio a R. 41 de 64
Funcions basiques
Descriptius basics
summary(dades.gencat$X..ABSTENCIO)
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## 7.46 21.70 26.10 26.50 30.60 93.50 1
Introduccio a R. 42 de 64
Funcions basiques
Suma
sum(dades.gencat$X..ABSTENCIO)
## [1] NA
sum(dades.gencat$X..ABSTENCIO,na.rm=T)
## [1] 26666
Introduccio a R. 43 de 64
Funcions basiques
Mitjana
mean(dades.gencat$X..VOTANTS)
## [1] NA
mean(dades.gencat$X..VOTANTS,na.rm=T)
## [1] 73.55
Introduccio a R. 44 de 64
Funcions basiques
Desviacio
sd(dades.gencat$X..VOTANTS)
## [1] NA
sd(dades.gencat$X..VOTANTS,na.rm=T)
## [1] 7.997
Introduccio a R. 45 de 64
Funcions basiques
Quartils
quantile(dades.gencat$X..VOTANTS,na.rm=T)
## 0% 25% 50% 75% 100%
## 6.49 69.44 73.91 78.27 92.54
Introduccio a R. 46 de 64
Funcions basiques
Taula frequencies
table(dades.gencat$PROVINCIA)
##
## Barcelona Girona Lleida Tarragona
## 44 323 223 233 186
Introduccio a R. 47 de 64
Funcions basiques
Taula contingencia
table(dades.gencat$PROVINCIA,dades.gencat$PROVINCIA)
##
## Barcelona Girona Lleida Tarragona
## 44 0 0 0 0
## Barcelona 0 323 0 0 0
## Girona 0 0 223 0 0
## Lleida 0 0 0 233 0
## Tarragona 0 0 0 0 186
Introduccio a R. 48 de 64
Transformacio de dades
Introduccio a R. 49 de 64
Transformacions de dades
Infinitat de metodes per transformar les dades
Especıfics per factors
Especıfics per numeriques
Per tot tipus de dades
Introduccio a R. 50 de 64
Transformacio factors
levels() es pot utilitzar per canviar les catetories
dades.gencat$prov <- dades.gencat$PROVINCIA
levels(dades.gencat$prov)
## [1] "" "Barcelona" "Girona" "Lleida" "Tarragona"
levels(dades.gencat$prov) = c("Districte","Est","Est","Oest","Oest")
table(dades.gencat$prov,dades.gencat$PROVINCIA)
##
## Barcelona Girona Lleida Tarragona
## Districte 44 0 0 0 0
## Est 0 323 223 0 0
## Oest 0 0 0 233 186
Introduccio a R. 51 de 64
Transformacio numerica
cut() genera trams d’una variable numerica
summary(dades.gencat$X..VOTANTS)
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## 6.49 69.40 73.90 73.50 78.30 92.50 1
dades.gencat$votants <- cut(dades.gencat$X..VOTANTS,
breaks=quantile(dades.gencat$X..VOTANTS,na.rm=T),
include.lowest=TRUE)
summary(dades.gencat$votants)
## [6.49,69.4] (69.4,73.9] (73.9,78.3] (78.3,92.5] NA's
## 252 252 252 252 1
Introduccio a R. 52 de 64
Transformacio qualsevol tipus
ifelse() es una funcio que evalua una sentencia i actua enconsequencia
dades.gencat$bcnmolt <- ifelse(dades.gencat$PROVINCIA=="Barcelona" & dades.gencat$X..VOTANTS>=80,
"bcn molts",
"altres")
table(dades.gencat$bcnmolt)
##
## altres bcn molts
## 955 54
Introduccio a R. 53 de 64
Transformacio qualsevol tipus
car::recode recodifica les dades de qualsevol tipus
library(car)
dades.gencat$localitzacio <- recode(dades.gencat$PROVINCIA,
"c('Barcelona','Girona')='Est';''='Districte';else='Oest'",
as.factor.result=TRUE)
table(dades.gencat$localitzacio,dades.gencat$PROVINCIA)
##
## Barcelona Girona Lleida Tarragona
## Districte 44 0 0 0 0
## Est 0 323 223 0 0
## Oest 0 0 0 233 186
Introduccio a R. 54 de 64
Analisi de dades
Introduccio a R. 55 de 64
Procediments d’analisi
Introduccio a R. 56 de 64
Procediments d’analisi’
1 Carregar dades
2 Identificar les dades (descriptius, grafics)
3 Identificar les necessitats de l’explotacio
4 Transformar les dades
5 Explotar les dades
Introduccio a R. 57 de 64
Els grafics en R
Introduccio a R. 58 de 64
Funcions per graficar
Funcions per controlar la finestra
par()layout()
Funcions de primer nivell
hist()plot()boxplot()barplot()
Funcions de segon nivell
legend()points()text()lines()abline()Funcio de primer nivell: add=TRUE
Introduccio a R. 59 de 64
Finestra
par()
par(mar=c(5.1, 4.1, 4.1, 2.1)) : estableix els margespar(mfrow=c(2,3)) : divideix en numero de fileres i numero decolumnespar(xpd=TRUE) : permet posicionar la llegenda fora de l’areadel grafic...
layout()
layout(matrix(c(1,2,3,4), ncol=2, byrow=FALSE))
Introduccio a R. 60 de 64
hist()
hist(dades.gencat$X..VOTANTS)
Histogram of dades.gencat$X..VOTANTS
dades.gencat$X..VOTANTS
Fre
quen
cy
0 20 40 60 80 100
010
020
030
040
050
0
Introduccio a R. 61 de 64
plot()
plot(dades.gencat$X..VOTANTS~dades.gencat$X..VOTS.VALIDS,col=dades.gencat$prov,pch=19)
legend("topleft",legend=levels(dades.gencat$prov),fill=1:3)
●●●
●
●●
●●
●
●
●●
●
●
●
●●
●
●●
●●
●
●
●
●
●●
●●
●
●
●
●●
●
●
●●
●
●●
●
●
●
●
●●
●
●
●
●●●
●●
●
●
●
●
●
●●
●●
●
●
●
●●
●●
●
●
●
●
●
●
●
●
●
●●
●
●●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●● ●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●●
●
●
●●
●●
●●●
●
●
● ●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
● ●
●
●
●
●
●
●
●
●
●●●
●●
●
●
●
●
●
●
●●
●
●
● ●
●●
●
●
●●
●
●
●
●
●●
●
●
●
●
●●
●
●
●●
●
●
●
●●●●●
●
●
●
●
●
●
●
●●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●●
●
●
●●
● ●
●
●
●
●●
●
●●
●● ●
●
●
●
●
●
●
●●
●
●
●
●●
●●
●
●
●●
●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●●
●
●
●●
●
●●
●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●●
●
●
●
●●
●
●●
●
●
●
●
●
●●
●
●
●
●●
●●
●
●●
●
●●
●●
●●●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●●
●
●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
● ●
●
●
●
●●
●
●
●
●
● ●
●
●
●
●
●
●●
●●
●●
●
●
●
●●
●
●
●
●
●
●
●
●●●
●●
●
●
●●
●
●●
●
●●●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
● ●●
●
●
●
●
●
●●
●
●
●●●
●●
●
●
●●
●
●● ●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●● ●●
●
●●
●
●
●
●
●
●
●●
●
●
●
●●
●
●
●
●●
●
●
●
●
●
●
●
●
●●
●
●
●
●●
●
●
●● ●
●
●●
●
●
●
●●
●●●●
●
●
●
●
●
●●
●
●
●
●
●
●●
●
●
●
● ●
●
●
●
●
●
●
●
●
●●
●●
●
●
● ●
●
●●
●
●
●
●
●●
●●
●
●
●
●
●
●●
●
●●
●●
●
●●
●
●
●
●
●
●
●
●●
●
●
●
●
● ●
●●●
●●
●
●●
●
●
●
●●
●
●
●●●
●
●
● ●
●
●
●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●
● ●
●●
● ●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●●
●
●
●
●
●
●
● ●
●
●
●
●
●
● ●●
●
●
●
●
●
●
●
●
●
●
●
●●●●
●
●
●
●
●
●
●●
●
●
●
●
●●
●
●
●
●
●
●●
●
●
●
●●
●
●●
●
●
●
●●●
●
●
●
●●
●
●●
●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●●●
●
●
●
●
●
●
●●
●
●
●●
●
●●
●
●
●
●
●●
●
●
●
●
●
●
●
●
● ●
●
●
●
●
●
●
●
●●
●
●
●
●
●
● ●
●● ●
●
●
●
●
●
●
●●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●
● ●
●
●
●
●
●
●
●
●
●
●
●
●
●
● ●●
●
●
●
●
●
●
●
●
●
●
●●
●●
●
●
●
● ●●
●
●
●
●
●●
●●
85 90 95 100
2040
6080
dades.gencat$X..VOTS.VÀLIDS
dade
s.ge
ncat
$X..V
OTA
NT
SDistricteEstOest
Introduccio a R. 62 de 64
boxplot()
boxplot(dades.gencat$X..VOTANTS~dades.gencat$PROVINCIA)
points(tapply(dades.gencat$X..VOTANTS,dades.gencat$PROVINCIA,mean), col="red", pch=19)
●
●
●
●
●
●
●●●
●●
●
●
●
●
●
●
●
●
●
Barcelona Girona Lleida Tarragona
2040
6080
●●
●●
Introduccio a R. 63 de 64
barplot()
barplot(prop.table(table(dades.gencat$PROVINCIA))*100)
Barcelona Girona Lleida Tarragona
05
1015
2025
30
Introduccio a R. 64 de 64