Exercices

iris

A partir des données iris, déjà présentes dans R, créer les tableaux suivantes, à l’aide des fonctions aggregate() et merge() :

  • Moyenne
aggregate(. ~ Species, iris, mean)
     Species Sepal.Length Sepal.Width Petal.Length Petal.Width
1     setosa        5.006       3.428        1.462       0.246
2 versicolor        5.936       2.770        4.260       1.326
3  virginica        6.588       2.974        5.552       2.026
  • Ecart-type
aggregate(. ~ Species, iris, sd)
     Species Sepal.Length Sepal.Width Petal.Length Petal.Width
1     setosa    0.3524897   0.3790644    0.1736640   0.1053856
2 versicolor    0.5161711   0.3137983    0.4699110   0.1977527
3  virginica    0.6358796   0.3224966    0.5518947   0.2746501
  • Infos sur Sepal.Length
aggregate(Sepal.Length ~ Species, iris, summary)
     Species Sepal.Length.Min. Sepal.Length.1st Qu. Sepal.Length.Median
1     setosa             4.300                4.800               5.000
2 versicolor             4.900                5.600               5.900
3  virginica             4.900                6.225               6.500
  Sepal.Length.Mean Sepal.Length.3rd Qu. Sepal.Length.Max.
1             5.006                5.200             5.800
2             5.936                6.300             7.000
3             6.588                6.900             7.900
  • Moyenne et médiane de Sepal.Length
merge(setNames(aggregate(Sepal.Length ~ Species, iris, mean), c("Espèce", "Moyenne")), 
      setNames(aggregate(Sepal.Length ~ Species, iris, median), c("Espèce", "Médiane")))
      Espèce Moyenne Médiane
1     setosa   5.006     5.0
2 versicolor   5.936     5.9
3  virginica   6.588     6.5
# ou
setNames(
    merge(aggregate(Sepal.Length ~ Species, iris, mean), 
          aggregate(Sepal.Length ~ Species, iris, median),
          by = "Species"),
    c("Espèce", "Moyenne", "Médiane")
)
      Espèce Moyenne Médiane
1     setosa   5.006     5.0
2 versicolor   5.936     5.9
3  virginica   6.588     6.5

heart.txt

heart = read.table("donnees/heart.txt", header = T)

Manipulation

  1. Créer un nouveau data.frame avec uniquement les individus masculins ayant un problème cardiaque
heartM = subset(heart, subset = sexe == "masculin")
  1. Avec ces données, en créer un autre ne gardant que les variables suivantes :
    • type_douleur, sucre, electro, et vaisseau
    • angine, depression
heartMbis = subset(heartM, select = c(type_douleur, sucre, electro, vaisseau,
                                      angine, depression))
  1. Créer un nouveau data.frame à partir de ce data.frame, avec
    1. une variable nbA comptant le nombre de fois où une variable des variables suivantes est égale à A : type_douleur, sucre, electro, et vaisseau
    2. une variable flag avec les deux modalités suivantes :
      • "problème" : angine à "oui" et depression supérieur ou égal à 4.0
      • "attention" : sinon
heartMter = transform(heartMbis,
                      nbA = (type_douleur == "A") + (sucre == "A") +
                          (electro == "A") + (vaisseau == "A"),
                      flag = factor(angine == "oui" & depression >= 4, 
                                    labels = c("attention", "probleme")))

Agrégats

  1. Comparer le cholesterol selon la présence ou non de problème de coeur
aggregate(cholester ~ coeur, heart, mean)
     coeur cholester
1  absence  244.2133
2 presence  256.4667
  1. Calculer le nombre de personnes concernés par un problème de coeur
# Ici, pour length, on peut mettre n'importe quelle autre variable que coeur à gauche
setNames(aggregate(age ~ coeur, heart, length), c("coeur", "nb"))
     coeur  nb
1  absence 150
2 presence 120
  1. Fusionner les deux data.frames précédement créés pour avoir les informations en une seule table
merge(aggregate(cholester ~ coeur, heart, mean),
      setNames(aggregate(age ~ coeur, heart, length), c("coeur", "nb")))
     coeur cholester  nb
1  absence  244.2133 150
2 presence  256.4667 120
  1. Calculer les moyennes de chaque variable quantitative selon la présence ou non de problème de coeur
# pic et depression sont des quantis discrètes a priori
aggregate(. ~ coeur, 
          subset(heart, select = c(age, pression, cholester, 
                                   taux_max, depression, pic,
                                   coeur)), 
          mean)
     coeur      age pression cholester taux_max depression      pic
1  absence 52.70667 128.8667  244.2133 158.3333  0.6226667 1.400000
2 presence 56.59167 134.4417  256.4667 138.8583  1.5841667 1.816667
  1. Comparer l’âge selon la présence ou de problème de coeur et de problème d’angine
aggregate(age ~ angine + coeur, heart, mean)
  angine    coeur      age
1    non  absence 52.54331
2    oui  absence 53.60870
3    non presence 56.77778
4    oui presence 56.43939