CC BY-NC-ND 3.0
if
if
SI [cela] ALORS [cela] SINON [cela]
if
## [1] "myVar < 3"
if
myVar <- 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"
if
if
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"
if
if
n’évalue que le premier élément :
## [1] "vrai (1)"
if
if
if
## [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 &&
for
for
bdd <- 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
for
letras <- 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 R
R 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
for
letras <- 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
for
C’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
while
myNumber <- 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
while
repeticiones <- 0
startTime <- Sys.time()
while(Sys.time() - startTime < 0.5){
repeticiones <- repeticiones + 1
}
print(repeticiones)
## [1] 10847
while
repeticiones <- 0
startTime <- Sys.time()
while(Sys.time() - startTime < 0.5){
repeticiones <- repeticiones + 1
if(repeticiones >= 1000){
break
}
}
print(repeticiones)
## [1] 1000
while
myNumber <- 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"
apply
apply
## [,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
apply
bdd <- 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
lapply
myList <- 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
lapply
myList <- 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
lapply
lapply(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"
lapply
Nombre 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
sapply
myDF <- 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
sapply
sapply
tapply
col0 <- 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