R
- STID 2ème annéeDans 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
data.frame
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
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
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 :
"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"C:/chemin/vers/rep/fichier.ext"
: on indique clairement où se situe le fichierL’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.
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()
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 fichierheader
: 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).
Nous remarquons les points suivants :
";"
)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.
"%"
","
), comme en français""
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)
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'"
Dans R
, tout objet peut avoir un ou plusieurs attributs, en particulier les data.frame
s, 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"
Vous devez importer les données suivantes dans R
.
Pas de difficulté spéciale ici. Le séparateur est la tabulation (\t
en R).
Ici, les premières lignes ne sont pas à prendre en considération lors de l’importation. Et nous avons des labels
pour les variables.
Attention à l’indicateur de données manquantes (?
dans ce fichier).
Dans ces données, il faut noter les points suivants :
"?"
adult.names
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
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.
FALSE/TRUE
pour la présence ou non de problème de coeur (dernière variable)A
(entre type_douleur
, sucre
, electro
, et vaisseau
)factor
à partir de l’indicatrice binaire faite au point 1 avec comme labels des modalités presence
pour TRUE
et absence
pour FALSE
data.frame
avec uniquement les individus ayant strictement moins de 60 ansdata.frames
:
Reprendre l’importation du fichier detroit_homicide.txt
(cf ci-dessus)
data.frame
data.frame
à deux colonnes