Type de données

Transformation de type

Dans R, il est possible de passer d’un type à l’autre, quand cela est possible, avec les commandes as.nouveautype(). Ci-dessous sont présentés deux exemples simples (passage de numeric à character et inversement).

> as.character(c(1, 3, 5))
[1] "1" "3" "5"
> as.numeric(c("1", "3", "5"))
[1] 1 3 5

Il existe d’autres commandes de ce type que vous découvrirez progressivement.

factor

Nous avons déjà vu dans le TP1 des variables numeric dans un data.frame avec mtcars, ainsi qu’un vecteur de character avec le nom des colonnes de cette table.

> class(mtcars$mpg)
[1] "numeric"
> class(rownames(mtcars))
[1] "character"

Il existe dans R un moyen de stocker des variables qualitatives, avec le type factor. Si nous prenons la variable am de mtcars, indiquant le type de transmission (boîte de vitesses) de la voiture, et qui vaut 0 (automatique) ou 1 (manuelle). C’est clairement une variable qualitative. Elle est stockée au format numeric, mais on peut la passer soit en character, soit en factor.

> mtcars$am
 [1] 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1
> as.character(mtcars$am)
 [1] "1" "1" "1" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0" "0"
[18] "1" "1" "1" "0" "0" "0" "0" "0" "1" "1" "1" "1" "1" "1" "1"
> as.factor(mtcars$am)
 [1] 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1
Levels: 0 1

On remarque pour le type factor, en plus des valeurs, R garde les modalités de la variable (nommées levels ici).

On dispose de la fonction factor, qui transforme une variable en factor. L’intérêt de celle-ci, par rapport à as.factor(), est qu’il est possible de paramètrer le nom des modalités.

> factor(mtcars$am)
 [1] 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1
Levels: 0 1
> factor(mtcars$am, labels = c("automatic", "manual"))
 [1] manual    manual    manual    automatic automatic automatic automatic
 [8] automatic automatic automatic automatic automatic automatic automatic
[15] automatic automatic automatic manual    manual    manual    automatic
[22] automatic automatic automatic automatic manual    manual    manual   
[29] manual    manual    manual    manual   
Levels: automatic manual

Modification de data.frame

Création

La fonction data.frame permet de créer un data.frame à partir de vecteurs. Elle prend en paramètre les vecteurs, qu’on peut nommer directement.

> v = 1:100
> d = data.frame(
+     x = v,
+     y = v * log(v)
+ )
> head(d)
  x         y
1 1  0.000000
2 2  1.386294
3 3  3.295837
4 4  5.545177
5 5  8.047190
6 6 10.750557

Ajout de variables

Il est possible d’ajouter des variables à un data.frame de manière assez simple.

> d$z = factor(sin(v) > 0)
> head(d)
  x         y     z
1 1  0.000000  TRUE
2 2  1.386294  TRUE
3 3  3.295837  TRUE
4 4  5.545177 FALSE
5 5  8.047190 FALSE
6 6 10.750557 FALSE

Accès aux fichiers

Adressage relatif ou absolu

Dans tout langage de programmation, dès qu’on veut accéder à un fichier (ou l’écrire), on a le choix entre deux types d’adressage pour situer ce fichier :

  • relatif : le chemin vers le fichier est indiqué par rapport au répertoire courant
    • "fichier.ext" : le fichier est dans le répertoire courant
    • "rep/fichier.ext" : le fichier est dans le sous-dossier "rep" présent dans le répertoire courant
    • "../fichier.ext": le fichier est dans le répertoire contenant le répertoire courant
  • absolu : le chemin vers le fichier est défini de manière absolument et ne dépend pasdu répertoire courant
    • "C:/chemin/vers/rep/fichier.ext" : on indique clairement où se situe le fichier

L’adressage absolu est utile si vous êtes certain que le fichier ne changera jamais de place (accès à un fichier sur un serveur, travail dans un environnement fixe, …). Mais on utilise plus facilement l’adresse relatif, car les fichiers à lire ou écrire se trouve généralement dans le répertoire courant ou dans un sous-répertoire.

Répertoire de travail

Dans R, la notion de répertoire de travail permet au logiciel de savoir où lire et écrire les fichiers (texte, image, vidéo, …). C’est le répertoire courant dans lequel le logiciel cherche. Il est possible de connaître ce répertoire avec la commande getwd()

> getwd()
[1] "/home/francois-xavier/Documents/fxjollois.github.io/archive-2016-2017"

Il est possible de le changer via la commande setwd(). On vérifie ensuite que la commande a bien fonctionné.

> setwd("/Users/fxjollois/Documents/")
> getwd()

Importation de données texte

Il est possible d’importer des données provenannt de fichiers texte avec la commande read.table(), qui a les paramètres principaux suivants (avec valeur par défaut éventuelle) :

  • file : nom du fichier
  • header : présence ou non des noms de variables (FALSE)
  • sep : séparateur de variable (` `)
  • na.strings : chaîne(s) pour valeurs manquantes (NA)
  • skip : nombre de lignes à ne pas prendre en compte en début de fichier (0)
  • nrow : nombre de lignes à lire (-1 : toutes les lignes)
  • stringsAsFactors : transformations des chaînes en factor ou non (TRUE)

Cette fonction renvoie un objet de type data.frame.

Il existe quelques fonctions dérivés avec des valeurs par défaut différentes

  • read.csv(), read.csv2()
  • read.delim(), read.delim2()

Par exemple, nous disposons du fichier Iris.txt, contenant les données de 150 iris (données déjà présentes dans R dans l’objet iris pour information).

impossible à afficher

Nous remarquons les points suivants :

  • le nom des colonnes est présent dans la première ligne
  • le séparateur de colonnes est le point-virgule (";")

Pour importer ce fichier, nous devons donc utiliser le code suivant. Vous devez d’abord télécharger le fichier. Attention : il est supposé ici que le fichier est dans un sous-répertoire donnees du répertoire de travail.

> ir = read.table("donnees/Iris.txt", header = T, sep = ";")
> head(ir)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa

Il est aussi possible d’écrire un fichier texte à partir d’un data.frame, en spécifiant aussi les paramètres d’écriture. Par exemple, le code suivant écrit les données iris_bis dans un autre formalisme.

  • le séparateur de colonnes est le "%"
  • les noms des colonnes sont bien écrits
  • le nom des lignes ne sont incluses
  • le séparateur de décimales est la virgule (","), comme en français
  • il n’y a pas de "" ou de '' autour des chaînes de caractères
> write.table(ir, file = "donnees/Iris_bis.txt", sep = "%", 
+             row.names = FALSE, col.names = TRUE, dec = ",", quote = FALSE)
impossible à afficher

Il est parfois difficile de lire directement avec la commande read.table() ou ses dérivés. On peut utiliser dans ce cas la commande readLines(), qui comme son nom l’indique, lit les lignes les unes après les autres. Elle renvoie un tableau de chaîne de caractères, chaque valeur du tableau correspondant à une ligne.

> ir_lignes = readLines("donnees/Iris.txt")
> length(ir_lignes)
[1] 151
> ir_lignes[1]
[1] "'Sepal.Length';'Sepal.Width';'Petal.Length';'Petal.Width';'Species'"
> ir_lignes[2]
[1] "5.1;3.5;1.4;0.2;'setosa'"

Attributs d’un objet

Dans R, tout objet peut avoir un ou plusieurs attributs, en particulier les data.frames, comme par exemple la classe de l’objet, le nom des colonnes, et le nom des lignes. On peut avoir la liste des attributs avec la commande attributes(). Celle-ci nous renvoie une list contenant des objets nommés.

> attributes(mtcars)
$names
 [1] "mpg"  "cyl"  "disp" "hp"   "drat" "wt"   "qsec" "vs"   "am"   "gear"
[11] "carb"

$row.names
 [1] "Mazda RX4"           "Mazda RX4 Wag"       "Datsun 710"         
 [4] "Hornet 4 Drive"      "Hornet Sportabout"   "Valiant"            
 [7] "Duster 360"          "Merc 240D"           "Merc 230"           
[10] "Merc 280"            "Merc 280C"           "Merc 450SE"         
[13] "Merc 450SL"          "Merc 450SLC"         "Cadillac Fleetwood" 
[16] "Lincoln Continental" "Chrysler Imperial"   "Fiat 128"           
[19] "Honda Civic"         "Toyota Corolla"      "Toyota Corona"      
[22] "Dodge Challenger"    "AMC Javelin"         "Camaro Z28"         
[25] "Pontiac Firebird"    "Fiat X1-9"           "Porsche 914-2"      
[28] "Lotus Europa"        "Ford Pantera L"      "Ferrari Dino"       
[31] "Maserati Bora"       "Volvo 142E"         

$class
[1] "data.frame"

On peut accéder à chaque objet de cette liste via le nom de l’objet, de deux façons différentes, comme présenté ci-dessous.

> attributes(mtcars)$names
 [1] "mpg"  "cyl"  "disp" "hp"   "drat" "wt"   "qsec" "vs"   "am"   "gear"
[11] "carb"
> attr(mtcars, "names")
 [1] "mpg"  "cyl"  "disp" "hp"   "drat" "wt"   "qsec" "vs"   "am"   "gear"
[11] "carb"

Il est aussi possible de définir de nouveaux attributs à un data.frame, via la commande attr(). Celui-ci ne sera pas visible lorsqu’on l’affichera, mais auquel on pourra accéder directement avec les commandes ci-dessus.

> attr(mtcars, "info") = "Ce jeu de données présentes des informations sur 32 voitures, décrites par 11 variables"
> mtcars$info
NULL
> attributes(mtcars)
$names
 [1] "mpg"  "cyl"  "disp" "hp"   "drat" "wt"   "qsec" "vs"   "am"   "gear"
[11] "carb"

$row.names
 [1] "Mazda RX4"           "Mazda RX4 Wag"       "Datsun 710"         
 [4] "Hornet 4 Drive"      "Hornet Sportabout"   "Valiant"            
 [7] "Duster 360"          "Merc 240D"           "Merc 230"           
[10] "Merc 280"            "Merc 280C"           "Merc 450SE"         
[13] "Merc 450SL"          "Merc 450SLC"         "Cadillac Fleetwood" 
[16] "Lincoln Continental" "Chrysler Imperial"   "Fiat 128"           
[19] "Honda Civic"         "Toyota Corolla"      "Toyota Corona"      
[22] "Dodge Challenger"    "AMC Javelin"         "Camaro Z28"         
[25] "Pontiac Firebird"    "Fiat X1-9"           "Porsche 914-2"      
[28] "Lotus Europa"        "Ford Pantera L"      "Ferrari Dino"       
[31] "Maserati Bora"       "Volvo 142E"         

$class
[1] "data.frame"

$info
[1] "Ce jeu de données présentes des informations sur 32 voitures, décrites par 11 variables"
> attr(mtcars, "info")
[1] "Ce jeu de données présentes des informations sur 32 voitures, décrites par 11 variables"

Exercices

Importation de données

Vous devez importer les données suivantes dans R.

heart.txt

Pas de difficulté spéciale ici. Le séparateur est la tabulation (\t en R).

impossible à afficher

Detroit_homicide.txt

Ici, les premières lignes ne sont pas à prendre en considération lors de l’importation. Et nous avons des labels pour les variables.

impossible à afficher

hepatitis.TXT

Attention à l’indicateur de données manquantes (? dans ce fichier).

impossible à afficher

adult.data

Dans ces données, il faut noter les points suivants :

  • le fichier de données fait 3.8 Mo
  • les données manquantes sont indiquées par des "?"
  • les noms des variables sont dans le fichier adult.names
  • Ne sont présentées ci-après que les 6 premières lignes du fichier
39, State-gov, 77516, Bachelors, 13, Never-married, Adm-clerical, Not-in-family, White, Male, 2174, 0, 40, United-States, <=50K
50, Self-emp-not-inc, 83311, Bachelors, 13, Married-civ-spouse, Exec-managerial, Husband, White, Male, 0, 0, 13, United-States, <=50K
38, Private, 215646, HS-grad, 9, Divorced, Handlers-cleaners, Not-in-family, White, Male, 0, 0, 40, United-States, <=50K
53, Private, 234721, 11th, 7, Married-civ-spouse, Handlers-cleaners, Husband, Black, Male, 0, 0, 40, United-States, <=50K
28, Private, 338409, Bachelors, 13, Married-civ-spouse, Prof-specialty, Wife, Black, Female, 0, 0, 40, Cuba, <=50K
37, Private, 284582, Masters, 14, Married-civ-spouse, Exec-managerial, Wife, White, Female, 0, 0, 40, United-States, <=50K

Compléments

Reprendre l’importation du fichier heart.txt (cf ci-dessus), et répondre aux questions suivantes en complétant le code précédemment écrit.

  1. Créer une indicatrice binaire FALSE/TRUE pour la présence ou non de problème de coeur (dernière variable)
  2. Créer une variable comptant le nombre de fois où une variable est égale à A (entre type_douleur, sucre, electro, et vaisseau)
  3. Créer une variable factor à partir de l’indicatrice binaire faite au point 1 avec comme labels des modalités presence pour TRUE et absence pour FALSE
  4. Créer un nouveau data.frame avec uniquement les individus ayant strictement moins de 60 ans
  5. Créer maintenant, à partir du précédent, deux data.frames :
    • un pour les hommes
    • un autre pour les femmes

Reprendre l’importation du fichier detroit_homicide.txt (cf ci-dessus)

  1. Intégrer le texte introductif dans un attribut du data.frame
  2. Intégrer les labels des variables dans un autre attribut, sous forme de data.frame à deux colonnes