Présentation

Avant-propos

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.

Boucles sur des nombres

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)

Boucles sur une liste

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.

Application

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()

★ Ecrivez maintenant une boucle qui génère, en un seul .pdf, les graphiques de toutes les variables de ce fichier :

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.

☆☆☆