```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE, cache = TRUE)
```


## Exercice 1.1 : Création de vecteurs

1. Les 3 vecteurs sont créés en utilisant la fonction *rep* avec les arguments *each* et *times*:
```{r,message=FALSE,warning=FALSE}
vec1 <- rep(1:5,3)
vec1
vec2 <- rep(1:5,each=3)
vec2
vec3 <- rep(1:4,times=(2:5))
vec3
```

2. La fonction *paste* concatène les vecteurs de type *character*:

```{r,message=FALSE,warning=FALSE}
vec4 <- paste("A",0:10,")",sep="")
vec4
```

3. La position de la lettre q est calculée et ensuite le vecteur de lettre et le vecteur d'indices sont concaténés:

```{r,message=FALSE,warning=FALSE}
pos.q <- which(letters=="q")
vec5 <- paste(letters[1:pos.q],1:pos.q,sep="") 
vec5
```

## Exercice 1.2 : Travailler avec les valeurs manquantes *NA*

1. Créons le vecteur *vec1* et calculons sa moyenne et sa variance:

```{r,message=FALSE,warning=FALSE}
set.seed(007)
vec1 <- runif(100,0,7)
mean(vec1)
var(vec1) 
```

2. Allouons les valeurs manquantes

```{r,message=FALSE,warning=FALSE}
set.seed(008)
vec2 <- vec1
ind <- sample(1:100,10)
vec2[ind] <- NA
indNA <- which(is.na(vec2))
```

3. Afin de ne pas obtenir de valeur manquante il est nécessaire d'utiliser *na.rm=TRUE*:

```{r,message=FALSE,warning=FALSE}
mean(vec2)
mean(vec2,na.rm=TRUE)
var(vec2)
var(vec2,na.rm=TRUE)
```
4. Nous supprimons les valeurs manquantes et nous retrouvons les mêmes valeurs que précédemment avec l'argument *na.rm=TRUE*:

```{r,message=FALSE,warning=FALSE}
vec3 <- vec2[-indNA]
mean(vec3)
var(vec3)
```
5. Si nous remplaçons les valeurs manquantes par la moyenne, la moyenne reste la même mais la variance est sous-estimée:

```{r,message=FALSE,warning=FALSE}
vec4 <- vec2
vec4[indNA] <- mean(vec3)
mean(vec4)
var(vec4)
```

6. Les valeurs manquantes sont remplacées par des valeurs issues de tirages aléatoires selon une loi normale de moyenne la moyenne empirique de *vec3* et d'écart-type empirique de *vec3*:
```{r,message=FALSE,warning=FALSE}
vec5 <- vec2
vec5[indNA] <- rnorm(length(indNA),mean(vec3),sd(vec3))
mean(vec5)
var(vec5)
```
7. Les valeurs manquantes sont remplacées par des valeurs issues de tirages aléatoires selon une loi uniforme entre le minimum et le maximum  des valeurs observées:
```{r,message=FALSE,warning=FALSE}
vec6 <- vec2
vec6[indNA] <- runif(length(indNA),min(vec3),max(vec3))
mean(vec6)
var(vec6)
```
8. Ici nous procédons à un tirage avec remise parmi les valeurs non-manquantes:
```{r,message=FALSE,warning=FALSE}
vec7 <- vec2
vec7[indNA] <- sample(vec3,10)
mean(vec7)
var(vec7) 
```

## Exercice 1.3 : Création et inversion d'une matrice

1. Créons la matrice *mat*} avant de lui affecter des noms de lignes et colonnes:
```{r,message=FALSE,warning=FALSE}
mat <- matrix(c(1,0,3,4,5,5,0,4,5,6,3,4,0,1,3,2),ncol=4)
rownames(mat) <- paste("ligne",1:4,sep="-")
colnames(mat) <- paste("colonne",1:4)
```
2. Les éléments diagonaux sont obtenus avec:

```{r,message=FALSE,warning=FALSE}
vec <- diag(mat)
vec
```

3. Les deux premières lignes de *mat*:
```{r,message=FALSE,warning=FALSE}
mat1 <- mat[c(1,2),]
mat1
```

4. Les deux dernières colonnes de *mat*:
```{r,message=FALSE,warning=FALSE
mat2 <- mat[,(ncol(mat)-1):ncol(mat)]
mat2
```

5. Toutes les colonnes sauf la troisième:
```{r,message=FALSE,warning=FALSE}
mat3 <- mat[,-3]
mat3
```
4. Pour calculer le déterminant, il suffit d'utiliser les fonctions *det* et *solve*:
```{r,message=FALSE,warning=FALSE}
det(mat)
solve(mat)
```

## Exercice 1.4 : Sélection et tri dans un data-frame

1. Chargeons le jeu de données *iris* puis créons un nouveau jeu de données en sélectionnant uniquement les individus qui prennent
la valeur *"versicolor"* pour la cinquième variable:

```{r,message=FALSE,warning=FALSE}
data(iris)
iris2 <- iris[iris[,5]=="versicolor", ]
```

2. On trie en fonction de la première variable à l'aide de la fonction *order*:

```{r,message=FALSE,warning=FALSE}
iris2[order(iris2[,1],decreasing=TRUE),]
```


## Exercice 1.5 : Utilisation de la fonction *apply*

1. Pour calculer les statistiques de base, il suffit d'utiliser la fonction *summary*:
```{r,message=FALSE,warning=FALSE}
library(lattice) # appel du package
data(ethanol)
summary(ethanol)
```

2. Pour calculer les quantiles, nous pouvons utiliser la fonction *apply*:

```{r,message=FALSE,warning=FALSE}
apply(X=ethanol,MARGIN=2,FUN=quantile)
```

3. L'instruction de la question précédente donne par défaut les quartiles. En effet, nous
 n'avons pas spécifié d'argument *probs* pour la fonction
 *quantile*, donc l'argument utilisé est celui défini par
 défaut: *probs=seq(0,1,0.25)* (voir l'aide de la fonction
 *quantile*). Pour obtenir les déciles, il faut donc spécifier
 comme argument *probs=seq(0,1,by=0.1)*. L'aide de la
 fonction *apply* indique les arguments optionnels via
 *...: optional arguments to 'FUN'*. Il est alors envisageable de 
 passer comme argument *probs=seq(0,1,by=0.1)* à la
 fonction *FUN=quantile*:

```{r,message=FALSE,warning=FALSE}
apply(ethanol,2,quantile,probs=seq(0,1,by=0.1))
```

## Exercice 1.6 : Sélection dans une matrice avec la fonction *apply*

1. La matrice contenant les colonnes de *mat* qui possèdent uniquement des valeurs plus petites que 6 est obtenue par:

```{r,message=FALSE,warning=FALSE}
mat <- matrix(c(1,0,3,4,5,5,0,4,5,6,3,4,0,1,3,2),ncol=4)
mat3 <- mat[,apply((mat<6),2,all)] 
mat3
```

2. Comme il n'y a qu'une seule ligne qui ne contient pas de 0, nous utilisons *drop=FALSE* afin que la sélection reste une matrice (et non pas un vecteur, ce qui est le comportement par défaut):

```{r,message=FALSE,warning=FALSE}
mat4 <- mat[apply((mat>0),1,all),,drop=FALSE]
mat4
```

## Exercice 1.7 Utilisation de  la fonction *lapply*

1. Le package *MASS* et le jeu de données *Aids2* sont chargés grâce à:

```{r,message=FALSE,warning=FALSE}
library(MASS)   # chargement du package
data(Aids2)
summary(Aids2)
```

2. La fonction *is.numeric* retourne un booléen:
  *TRUE* quand l'objet sur lequel elle est appliquée est de type *numeric.* Nous allons donc appliquer cette fonction à chaque colonne du data-frame
*Aids2* et ensuite prendre la négation (opérateur *!*). Comme un data-frame est une liste où chaque composante est une colonne (en général), appliquer la fonction à chaque colonne est (habituellement) équivalent à appliquer la fonction à chaque composante de la liste; c'est ce que fait la fonction *lapply*:
```{r,message=FALSE,warning=FALSE}
ind <- !unlist(lapply(Aids2,is.numeric))
```
3. Nous avons juste à sélectionner les variables (i.e. les colonnes
  du data-frame) avec le vecteur de booléen *ind*:
```{r,message=FALSE,warning=FALSE}
Aids2.qual <- Aids2[,ind]
```
4. Nous utilisons la fonction *levels* sur chaque composante (colonne) du data-frame *Aids2.qual*:
```{r,message=FALSE,warning=FALSE
lapply(Aids2.qual,levels)
```

## Exercice 1.8 Modalités des variables qualitatives et sélection

1.Le package *MASS* et le jeu de données *Aids2* sont chargés grâce à:
```{r,message=FALSE,warning=FALSE}
library(MASS)   # chargement du package
data(Aids2)
```
2. Les sélections sont obtenues par:
```{r,message=FALSE,warning=FALSE}
res <- Aids2[(Aids2[,"sex"]=="M")&(Aids2[,"state"]!="Other"),]
```
Une autre méthode serait d'utiliser la fonction *subset*.

3. Le résumé indique que les modalités sont toujours les mêmes,
  *M* et *F*, mais qu'aucun individu n'est dans la catégorie *F*:
```{r,message=FALSE,warning=FALSE}
summary(res)
```
4. Les attributs de la variable *sex* sont:
```{r,message=FALSE,warning=FALSE
attributes(res[,"sex"])
```
5. Transformons la variable *sex* en vecteur de caractère et imprimons les attributs du résultat:
```{r,message=FALSE,warning=FALSE}
sexc <- as.character(res[,"sex"])
attributes(sexc)
```
6. Transformons le vecteur de caractères *sexc* en vecteur de type *factor*:
```{r,message=FALSE,warning=FALSE}
sexf <- as.factor(sexc)
attributes(sexf)
```
7. Trouvons les indices des variables non quantitatives:
```{r,message=FALSE,warning=FALSE}
ind <- !unlist(lapply(res,is.numeric))
ind
```
8. Transformons ces variables en vecteurs de caractères:
```{r,message=FALSE,warning=FALSE}
res[,ind] <- lapply(res[,ind],as.character)
```
9. Re-transformons ces variables en vecteur de type *factor*:
```{r,message=FALSE,warning=FALSE
res[,ind] <- lapply(res[,ind],as.factor)
summary(res)
```
