R est conçu pour manipuler des objets ‘vecteur’ et ‘matrices’. Beaucoup de boucles sont évitées à l’utilisateur. Par exemple (l’affichage des 10 premiers entiers non nuls) …
x=1:10
print(x)
## [1] 1 2 3 4 5 6 7 8 9 10
… ou bien (les carrés des premiers nombres pairs) …
print(seq(0,10,2)^2)
## [1] 0 4 16 36 64 100
Mais dans certains cas, on est obligé d’écrire soi-même des boucles. Leur syntaxe est détaillée ci-dessous.
Voici un exemple de boucle écrite en R. Exécutez ce code.
for (i in 1:10){
print(i)
}
Essayez maintenant :
for (i in 1:10){
i
}
Conclusion : R n’affiche pas les variables dans une boucle, à moins
qu’on lui impose par print()
★ Ecrivez une boucle qui affiche les carrés des 10 premiers nombres entiers non nuls. Vous devriez obtenir celà :
## [1] 1
## [1] 4
## [1] 9
## [1] 16
## [1] 25
## [1] 36
## [1] 49
## [1] 64
## [1] 81
## [1] 100
Notez que la séquence de valeurs d’indices est “libre”. Par exemple
for (i in seq(0,30,6)){
print(paste0("i=",i," et i²=",i^2))
}
## [1] "i=0 et i²=0"
## [1] "i=6 et i²=36"
## [1] "i=12 et i²=144"
## [1] "i=18 et i²=324"
## [1] "i=24 et i²=576"
## [1] "i=30 et i²=900"
Et voici un exemple de double boucle. Exécutez :
for (i in 1:4){
for (j in 1:3){
print(c(i,j))
}
}
Maintenant, exécutez ce code, qui calcule le produit matriciel de deux matrices \(A\) et \(B\) :
A=matrix(1:8,4,2)
B=matrix((-2):3,2,3)
A%*%B
## [,1] [,2] [,3]
## [1,] -7 5 17
## [2,] -10 6 22
## [3,] -13 7 27
## [4,] -16 8 32
Vous allez retrouver la multiplication matricielle par des boucles.
★ Ecrivez une double boucle qui calcule \(M\), produit matriciel de \(A\) et \(B\) :
Pour vous aider, il faut compléter ceci (attention ! les matrices \(A\) et \(B\) peuvent être de tailles variables)
M=matrix(0,......
for ......
for ...
}
}
M
💡 On rappelle que l’élément de la ligne \(i\), colonne \(j\) de \(AB\) est égal au produit scalaire de la \(i^{ème}\) ligne de \(A\) avec la \(j^{ème}\) colonne de \(B\).
Vérifiez votre code en le comparant avec A%*%B
pour les
matrices :
A=matrix(1:10,2,5)
B=matrix(c(1,0,-9,7,3,6,5,0,-3,-1),5,2)
Importez ce fichier :
fic="https://pmbo-sd.fr/STID/Reporting_et_datavisualisation/France.txt"
Y=read.delim(fic,header=TRUE,sep=";",fileEncoding="UTF-8")
Y$Code=formatC(Y$Code,width=2,flag="0")
head(Y,1)
Testez ce code :
REGIONS=sort(unique(Y$region))
print(REGIONS)
… puis celui-ci …
for (reg in REGIONS){
print(paste("**************",reg,"**********"))
}
… et enfin celui-là :
for (reg in REGIONS){
print(paste("**************",reg,"**********"))
print(Y$Libelle[Y$region==reg])
}
Il est donc possible, par boucles, de parcourir les données d’un fichier.
Importez ce fichier d’entreprises :
fileName="https://pmbo-sd.fr/STID/Data_mining/entreprises.txt"
X=read.delim(fileName,
header=T,sep="\t",dec=".",stringsAsFactors = T)
X$dept=formatC(X$dept,width=2,flag="0")
X$dept=as.factor(X$dept)
Certaines variables de ce fichier sont quantitatives (numériques) et d’autres quantitatives (catégorielles, facteurs), comme le montre le résumé statistique :
summary(X)
## dept effectif ca_T1 ca_T2
## 04: 117 Min. : 10.00 Min. : 7.0 Min. : 7.0
## 05: 116 1st Qu.: 13.00 1st Qu.: 284.2 1st Qu.: 327.0
## 13:1375 Median : 19.00 Median : 529.5 Median : 603.5
## 84: 342 Mean : 30.38 Mean : 1224.0 Mean : 1460.5
## 3rd Qu.: 33.00 3rd Qu.: 1073.8 3rd Qu.: 1240.0
## Max. :532.00 Max. :48021.0 Max. :70900.0
##
## ca_T3 ca_T4 TYPE_COM
## Min. : 13.0 Min. : 14.0 Commune monopolarisee : 204
## 1st Qu.: 344.5 1st Qu.: 357.5 Commune multipolarisee : 85
## Median : 648.5 Median : 695.5 Espace a dominante rurale: 259
## Mean : 1536.9 Mean : 1771.0 Pole urbain :1402
## 3rd Qu.: 1333.8 3rd Qu.: 1574.0
## Max. :40611.0 Max. :75727.0
##
## activite evo_benefice
## Construction : Travaux divers, Menuiserie, Miroiterie:291 Min. :-27.0000
## Services, Location, Immobilier :280 1st Qu.: -0.2959
## Commerce Autres :274 Median : 0.1639
## Industrie manufacturiere : Autres :240 Mean : 1.0203
## Commerce de gros et intermediaires du commerce :222 3rd Qu.: 0.7317
## Industrie alimentaire, bois,cuir :127 Max. : 90.3529
## (Other) :516
## evo_effectif evo_risque age
## Min. :-0.7391 Min. :-2.0000 Min. : 1.00
## 1st Qu.: 0.0000 1st Qu.: 0.0000 1st Qu.:11.00
## Median : 0.0000 Median : 0.0000 Median :18.00
## Mean : 0.1962 Mean : 0.1441 Mean :20.79
## 3rd Qu.: 0.1752 3rd Qu.: 0.0000 3rd Qu.:28.00
## Max. :42.6000 Max. : 4.0000 Max. :57.00
##
★ Ecrivez une boucle qui affiche le résultat suivant :
## [1] "dept : est une variable catégorielle (qualitative)"
## [1] "effectif : est une variable numérique (quantitative)"
## [1] "ca_T1 : est une variable numérique (quantitative)"
## [1] "ca_T2 : est une variable numérique (quantitative)"
## [1] "ca_T3 : est une variable numérique (quantitative)"
## [1] "ca_T4 : est une variable numérique (quantitative)"
## [1] "TYPE_COM : est une variable catégorielle (qualitative)"
## [1] "activite : est une variable catégorielle (qualitative)"
## [1] "evo_benefice : est une variable numérique (quantitative)"
## [1] "evo_effectif : est une variable numérique (quantitative)"
## [1] "evo_risque : est une variable numérique (quantitative)"
## [1] "age : est une variable numérique (quantitative)"
Aide : la fonction is.numeric()
…
comme affiché ici : https://pmbo-sd.fr/STID/Data_mining/boucles_exemple.pdf
★ Pour vérifier que votre boucle fonctionne quel que soit le fichier
de données, importez dans X
ce fichier d’adultes américains
(source :
https://archive.ics.uci.edu/dataset/2/adult) …
fileName="https://pmbo-sd.fr/STID/Data_mining/clients.txt"
X=read.delim("clients.txt",header=T,sep=";",dec=".",
fileEncoding = "latin3",stringsAsFactors = T)
X$nb_mineur_foyer=as.factor(X$nb_mineur_foyer)
… et testez votre boucle sur ce X
.