CC BY-NC-ND 3.0
ififSI [cela] ALORS [cela] SINON [cela]
if## [1] "myVar < 3"
ifmyVar <- TRUE
if(is.character(myVar)){
print("myVar: character")
} else {
if(is.numeric(myVar)){
print("myVar: numeric")
} else {
if(is.logical(myVar)){
print("myVar: logical")
} else {
print("myVar: ...")
}
}
}## [1] "myVar: logical"
ifif n’évalue que le premier élément :
## Warning in if (prueba == TRUE) {: la condition a une longueur > 1 et seul
## le premier élément est utilisé
## [1] "vrai"
ifif n’évalue que le premier élément :
## [1] "vrai (1)"
ififif## [1] "vrai"
& y &&& : toutes les conditions
&& : la première condition et les suivantes si la première est vraie.
## [1] "Numéro < 10"
& y &&## Error in miNumero * 10: argument non numérique pour un opérateur binaire
& y &&forforbdd <- data.frame(rep01 = rnorm(n = 100, mean = 10, sd = 1),
rep02 = rnorm(n = 100, mean = 10, sd = 1))
print(head(bdd))## rep01 rep02
## 1 9.922518 9.388914
## 2 9.763272 10.363430
## 3 10.126622 8.706250
## 4 10.532272 8.633082
## 5 11.226414 9.911668
## 6 9.576858 11.637517
for## [1] 0.5336036
## [1] -0.6001578
## [1] 1.420372
## [1] 1.89919
## [1] 1.314747
forletras <- letters
for (i in seq_along(letras)){
if(letras[i] %in% c("a", "e", "i", "o", "u", "y")){
print(paste0("voyelle ", letras[i]," en position: ", i))
}
}## [1] "voyelle a en position: 1"
## [1] "voyelle e en position: 5"
## [1] "voyelle i en position: 9"
## [1] "voyelle o en position: 15"
## [1] "voyelle u en position: 21"
## [1] "voyelle y en position: 25"
for et RR ne gère pas bien les boucles for. Nous verrons plus tard comment utiliser des alternatives. En attendant, lorsque cela est possible, le travail avec des vecteurs devrait être préféré.
La plupart des exemples que l’on peut trouver sur Internet à propos de la boucle for peuvent être remplacés par des opérations vectorielles.
for## [1] 0.5336036
## [1] -0.6001578
## [1] 1.420372
## [1] 1.89919
## [1] 1.314747
## [1] 0.5336036 -0.6001578 1.4203723 1.8991897 1.3147469 -2.0606591
forletras <- letters
# [1] FOR
for (i in seq_along(letras)){
if(letras[i] %in% c("a", "e", "i", "o", "u", "y")){
print(paste0("voyelle ", letras[i]," en position: ", i))
}
}## [1] "voyelle a en position: 1"
## [1] "voyelle e en position: 5"
## [1] "voyelle i en position: 9"
## [1] "voyelle o en position: 15"
## [1] "voyelle u en position: 21"
## [1] "voyelle y en position: 25"
## [1] 1 5 9 15 21 25
for# nombre de nombres pairs
# [1] FOR
x <- sample(1:100, size = 20)
count <- 0
for (val in x) {
if(val %% 2 == 0){
count <- count + 1
}
}
print(count)## [1] 15
## [1] 15
for## [1] 1 4 9 16 25 36 49 64 81 100 121 144 169 196 225 256 289
## [18] 324 361 400
## [1] 1 4 9 16 25 36 49 64 81 100 121 144 169 196 225 256 289
## [18] 324 361 400
for# tirs de dés
# [1] FOR
ntrials = 1000
trials = rep(0, ntrials)
for (j in 1:ntrials){
trials[j] = sample(1:6, size = 1)
}
mean(trials)## [1] 3.532
## [1] 3.55
forC’est un bon exercice que d’explorer les nombreux exemples disponibles sur Internet sur la boucle for et d’essayer de les convertir en opérations vectorielles. Cela nous permet d’acquérir de bons réflexes de programmation avec R.
En conclusion, il est recommandé de ne pas utiliser la boucle for avec R aussi souvent que possible. Dans ce cours, nous verrons des alternatives telles que les boucles de la famille apply.
while## [1] 0
## [1] 1
## [1] 2
## [1] 3
whilemyNumber <- sample(x = 10000, size = 1)
myGuess <- sample(x = 10000, size = 1)
paste0("Mon numéro secret: ", myNumber)## [1] "Mon numéro secret: 3312"
## [1] "L'essai de l'ordinateur: 1871"
while## [1] "2019-10-03 16:15:22 CEST"
while## Time difference of 0.0499711 secs
whilerepeticiones <- 0
startTime <- Sys.time()
while(Sys.time() - startTime < 0.5){
repeticiones <- repeticiones + 1
}
print(repeticiones)## [1] 10847
whilerepeticiones <- 0
startTime <- Sys.time()
while(Sys.time() - startTime < 0.5){
repeticiones <- repeticiones + 1
if(repeticiones >= 1000){
break
}
}
print(repeticiones)## [1] 1000
whilemyNumber <- sample(x = 10000, size = 1)
myGuess <- sample(x = 10000, size = 1)
numberGuess <- 0
startTime <- Sys.time()
while(Sys.time() - startTime < 2){
if(myGuess == myNumber){
numberGuess <- numberGuess + 1
print(paste0("Numéro trouvé après ",
numberGuess, " essais."))
print(paste0("Et il me reste plein de temps : ",
round(2 - as.numeric(Sys.time() - startTime),
digits = 2), " sec"))
break
}else{
myGuess <- sample(x = 10000, size = 1)
numberGuess <- numberGuess + 1
}
}## [1] "Numéro trouvé après 1785 essais."
## [1] "Et il me reste plein de temps : 1.89 sec"
applyapply## [,1] [,2] [,3] [,4] [,5]
## [1,] -0.765678500 -0.67369120 -2.1656093 -0.006290591 0.1578879
## [2,] -0.392481315 0.01624043 1.6515738 -0.963538630 0.5536493
## [3,] 0.050797999 0.60440895 1.5157684 1.012658241 1.6332417
## [4,] 0.517874266 -1.64967892 -0.6950825 -0.514417550 0.3131771
## [5,] 1.295112262 1.27512866 2.5339502 -0.345414096 -0.4773363
## [6,] 1.201171895 -0.80655164 0.7211207 -1.168795153 0.3637982
## [7,] -0.004658158 -0.81436182 1.1036037 -1.476007842 -0.7272571
## [8,] 0.117754340 -1.21829151 0.7102438 1.934248526 -0.6153481
## [9,] -1.095758521 -1.49092506 0.2937126 -1.123399259 -0.6011720
## [10,] 0.587269667 0.52809171 0.4336630 0.714323346 -0.4448704
## [,6] [,7] [,8] [,9] [,10] [,11]
## [1,] -0.1574574 1.7784757 -0.1362339 0.75346327 -0.5188087 0.379799300
## [2,] 0.1286711 0.8491819 -0.5670995 -0.31280233 1.6058993 0.041667907
## [3,] -1.2179146 0.4523584 -1.1252471 0.70388775 -1.0472165 -0.659861566
## [4,] -0.2030493 -0.7501731 0.7651803 -0.02734863 -0.3728239 -1.400915096
## [5,] 0.1887325 0.0630280 -0.6035940 1.51503999 0.1022236 0.990118997
## [6,] -1.2284861 0.8244039 1.3275261 0.84106130 0.1510321 0.168100668
## [7,] 2.3881911 -0.1611549 -1.4104148 -0.78079191 -1.2320332 1.327540323
## [8,] -0.2757716 -0.1168048 -1.1365590 -0.28303457 0.1817849 0.008151492
## [9,] -0.7241912 -0.9991460 -1.5432550 0.87940636 -1.7245476 -0.076629050
## [10,] -1.8983092 -0.5911624 1.6922503 2.14439203 0.4030103 -0.470514376
## [,12] [,13] [,14] [,15] [,16]
## [1,] 1.86542390 1.046097706 -1.2843759 0.8939038 -1.32859019
## [2,] 1.40851593 -0.079016567 -2.0847531 -0.5431741 0.05104308
## [3,] -0.01385535 -0.577284663 -1.7228953 -1.0930826 -2.82631951
## [4,] -0.24578302 -0.010910824 0.1357681 0.5614728 1.55610358
## [5,] -0.61463797 -0.002600124 -1.5249794 -2.0696044 -0.13120837
## [6,] 0.86803670 1.522387139 -1.7154698 0.8565833 0.77852380
## [7,] -0.11475724 0.365898865 0.1306034 -0.6092724 0.28181046
## [8,] -0.83369511 -0.558669553 -1.0729783 0.3123619 0.89396039
## [9,] -1.27760457 -1.556003195 -1.0507980 1.1042818 -1.20453715
## [10,] -0.40005256 -0.046484226 -0.5760199 1.1692328 1.13748702
## [,17] [,18] [,19] [,20]
## [1,] -1.38041557 -0.07225535 0.41898974 -0.65687164
## [2,] -1.22895307 0.80843674 0.68172164 -0.38983164
## [3,] 1.56493549 0.71618580 -0.59873907 0.23565858
## [4,] -0.12088403 -0.17318792 1.10457733 -0.59570054
## [5,] -1.07026165 1.79788113 -2.28665727 0.07266582
## [6,] -0.59019201 -0.82027620 0.19608490 0.39040894
## [7,] -1.71876526 0.25478796 -0.04988575 -0.47316937
## [8,] 0.08164515 0.25683796 0.15376291 0.43720245
## [9,] -0.08203487 0.96380955 1.29691220 1.69710576
## [10,] 1.72451115 -1.69836501 -1.05249190 -0.23394655
apply## [1] 0.15114039 -0.42296304 0.61029443 -0.19366330 0.01557701
## [6] -0.29995847 0.13490067 -0.27374466 0.54332733 -0.24514797
## [11] 0.03074586 0.06415907 0.01034146 -1.07658982 0.05827029
## [16] -0.07917269 -0.28204147 0.20338547 -0.01357253 0.04835218
apply## [1] -0.10424461 0.02895417 0.01847133 -0.14703597 0.03021394
## [6] 0.37710357 -0.13795608 0.04489832 -0.86166861 0.17826304
applybdd <- matrix(sample(c(1:20, NA), size = 200, replace = TRUE),
ncol = 20)
apply(bdd, MARGIN = 2, FUN = mean)## [1] 10.0 NA 9.3 9.8 NA NA 9.0 7.0 12.8 NA 9.2 NA 15.3 NA
## [15] 12.3 NA 11.2 NA NA 6.3
apply## [1] 10.000000 6.125000 9.300000 9.800000 11.000000 11.666667 9.000000
## [8] 7.000000 12.800000 9.666667 9.200000 9.888889 15.300000 10.666667
## [15] 12.300000 12.333333 11.200000 12.875000 11.333333 6.300000
apply## [1] 10.000000 6.125000 9.300000 9.800000 11.000000 11.666667 9.000000
## [8] 7.000000 12.800000 9.666667 9.200000 9.888889 15.300000 10.666667
## [15] 12.300000 12.333333 11.200000 12.875000 11.333333 6.300000
lapplymyList <- list(
a = sample(1:100, size = 10),
b = sample(1:100, size = 10),
c = sample(1:100, size = 10),
d = sample(1:100, size = 10),
e = sample(1:100, size = 10)
)
print(myList)## $a
## [1] 71 13 91 32 1 79 73 6 46 84
##
## $b
## [1] 13 84 6 46 15 80 1 32 30 69
##
## $c
## [1] 52 79 31 87 86 46 11 12 62 60
##
## $d
## [1] 67 79 86 26 81 70 100 75 47 9
##
## $e
## [1] 82 48 74 62 85 57 44 43 80 16
lapply## $a
## [1] 49.6
##
## $b
## [1] 37.6
##
## $c
## [1] 52.6
##
## $d
## [1] 64
##
## $e
## [1] 59.1
lapplymyList <- list(
a = sample(c(1:5, NA), size = 10, replace = TRUE),
b = sample(c(1:5, NA), size = 10, replace = TRUE),
c = sample(c(1:5, NA), size = 10, replace = TRUE),
d = sample(c(1:5, NA), size = 10, replace = TRUE),
e = sample(c(1:5, NA), size = 10, replace = TRUE)
)
print(myList)## $a
## [1] NA 3 2 1 NA 5 4 5 1 3
##
## $b
## [1] 5 3 NA NA 1 NA 3 1 NA 1
##
## $c
## [1] 1 3 NA 2 1 2 2 3 NA NA
##
## $d
## [1] 4 NA 1 3 5 3 1 5 3 1
##
## $e
## [1] 3 2 5 5 5 4 3 3 NA 2
lapply## $a
## [1] NA
##
## $b
## [1] NA
##
## $c
## [1] NA
##
## $d
## [1] NA
##
## $e
## [1] NA
lapply## $a
## [1] 3
##
## $b
## [1] 2.333333
##
## $c
## [1] 2
##
## $d
## [1] 2.888889
##
## $e
## [1] 3.555556
lapply## $a
## [1] 3
##
## $b
## [1] 2.333333
##
## $c
## [1] 2
##
## $d
## [1] 2.888889
##
## $e
## [1] 3.555556
lapplylapply(myList, FUN = function(i){
m <- mean(i, na.rm = TRUE)
if(m > 3){
return("grand")
}else{
return("petit")
}
})## $a
## [1] "petit"
##
## $b
## [1] "petit"
##
## $c
## [1] "petit"
##
## $d
## [1] "petit"
##
## $e
## [1] "grand"
lapplyNombre de données manquantes
## $a
## [1] 2
##
## $b
## [1] 4
##
## $c
## [1] 3
##
## $d
## [1] 1
##
## $e
## [1] 1
sapply## $a
## [1] 2
##
## $b
## [1] 4
##
## $c
## [1] 3
##
## $d
## [1] 1
##
## $e
## [1] 1
sapply## a b c d e
## 2 4 3 1 1
sapply## a b c d e
## 3 3 3 NA 2
sapplymyDF <- data.frame(
a = sample(c(1:5, NA), size = 10, replace = TRUE),
b = sample(c(1:5, NA), size = 10, replace = TRUE),
c = sample(c(1:5, NA), size = 10, replace = TRUE),
d = sample(c(1:5, NA), size = 10, replace = TRUE),
e = sample(c(1:5, NA), size = 10, replace = TRUE)
)
print(myDF)## a b c d e
## 1 NA 4 3 4 4
## 2 1 2 4 3 5
## 3 NA 4 3 2 5
## 4 3 4 NA 2 5
## 5 3 1 NA 2 3
## 6 5 NA 1 4 3
## 7 2 4 5 2 NA
## 8 1 2 1 1 NA
## 9 4 4 3 4 NA
## 10 2 5 2 5 2
sapply## a b c d e
## 2 1 2 0 3
sapplysapplytapplycol0 <- sample(LETTERS[1:5], size = 1000, replace = TRUE)
col1 <- rnorm(n = 1000, mean = 10, sd = 0.5)
col2 <- rlnorm(n = 1000, meanlog = 10, sdlog = 0.5)
col3 <- rgamma(n = 1000, shape = 10, rate = 0.5)
dfCol <- data.frame(col0, col1, col2, col3)
print(head(dfCol, n = 10))## col0 col1 col2 col3
## 1 D 9.342874 45293.746 25.35815
## 2 A 9.751796 12577.267 15.64159
## 3 E 10.540578 11141.242 28.58087
## 4 B 9.534572 27562.190 14.32539
## 5 E 10.570737 9522.016 28.08649
## 6 A 9.441922 34658.559 19.85533
## 7 A 10.506382 24397.736 14.96653
## 8 A 10.109506 12841.923 21.42310
## 9 B 10.516283 22761.873 14.01590
## 10 B 9.487621 21817.316 27.89437
tapply## $A
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 8.879 9.699 10.057 10.048 10.409 11.406
##
## $B
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 8.495 9.639 10.031 9.994 10.367 11.594
##
## $C
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 8.281 9.692 10.029 10.021 10.363 11.219
##
## $D
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 8.419 9.733 10.084 10.051 10.410 11.342
##
## $E
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 8.961 9.624 10.007 10.013 10.342 11.505
tapply## [,1] [,2] [,3]
## A 10.048172 24646.62 19.86288
## B 9.993861 24899.61 18.95589
## C 10.021235 24542.52 19.82570
## D 10.051203 25866.84 20.15909
## E 10.012768 25846.31 20.64797
## [1] 5