R
- STID 1ère 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.
> iris = read.table("donnees/Iris.txt", header = T, sep = ";")
> head(iris)
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
dans un autre formalisme.
"%"
","
), comme en français""
ou de ''
autour des chaînes de caractères> write.table(iris, 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.
> iris_lignes = readLines("donnees/Iris.txt")
> length(iris_lignes)
[1] 151
> iris_lignes[1]
[1] "'Sepal.Length';'Sepal.Width';'Petal.Length';'Petal.Width';'Species'"
> iris_lignes[2]
[1] "5.1;3.5;1.4;0.2;'setosa'"
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).
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 Présence
pour TRUE
et Absence
pour FALSE
(refaire la variable coeur
en quelque sorte)data.frame
avec uniquement les individus ayant strictement moins de 60 ansdata.frames
: