TP n 1: Premiers pas sous R

Transcription

TP n 1: Premiers pas sous R
TP n◦1: Premiers pas sous R
Pascal Bessonneau
October 26, 2009
1
Partie 1: Types de base, affectation et valeurs
spéciales
Création d’un vecteur numérique simple
c(1,2)
Création d’un vecteur de booléen
c( T, F)
Conversion implicite du booléen en numérique. Les processus de conversion
implicites dans R sont fréquents et sont source de bugs.
c( T, F) + 0
Création d’un vecteur de character.
c("H","F")
L’appel à la fonction factor permet de définir des facteurs. Ils sont utiles
pour définir des vecteurs dont les modalités sont restreintes.
factor(c("H","F"))
Dans ce cas on définit avec l’argument levels une modalité supplémentaire.
Sinon R utilise les modalités présente dans le vecteur avec la commande sort(unique(variable))
(a <- factor(c("H","F"),levels=c("H","F","A"))
table(a)
Dans ce cas les vecteurs sont ordonnés. C’est très important pour certaines
analyses et/ou pour obtenir les tableaux de contingence avec ordre précis.
a <- c("tanche","moyen","bon", "excellent")
factor( a, levels=c(a), ordered=T )
Un tableau de vérité en utilisant l’opérateur ET (&)
c( T & T, F & T, F & F )
1
Un tableau de vérité en utilisant l’opérateur OU (—)
c( T | T, F | T, F | F )
Les comparaisons avec des valeurs NA sont délicates. Elles peuvent lever
des erreurs mais également renvoyer NA contre T ou F contre F.
c( NA & T, NA & F )
if ( NA & T ) print("plouf")
Pour vérifier qu’une valeur est NA ou NULL il faut utiliser les fonctions
is.na() ou is.null().
c( is.na(NA) & T, is.na(NA) & F )
Le même tableau de vérité avec la fonction adapté pour les NA.
c( !is.na(NA) | T, !is.na(NA) | F )
Idem avec is.null()
c( NULL & T, NULL & F )
L’affectation simple peut se faire avec deux opérateurs. Il est à noter que
contrairement à d’autres langages, R ne réponds pas vrai ou faux si l’affectation
a été possible mais la valeur de l’affectation. C’est ce qui peut être vu en
demandant à R d’écrire la valeur de l’affectation en la transformant en expression
avec les parenthèses.
a <- 5
(a<-5)
L’affectation dans l’autre sens.
6 -> a
a
Idem que précedement. L’affectation est évaluée et le résultat est stocké
dans a.
a <- b <- 8
a;b
Anecdotique pour certains, la fonction invisible() est importante à connaı̂tre.
En effet elle est utilisée dans de nombreuses fonctions R. Alors qu’une fonction
est appelée sans affectation ne renvoit rien, si on utilise une affectation on obtient
un résultat dans la variable. C’est primordial si l’on veut faire des graphiques
propres.
invisible(9)
a <- invisible(9)
a
2
R permet d’attribuer une valeur à une variable ou un mot-clef sans avertissement. Cela peut poser problème. On peut le résoudre en supprimant l’objet
par la commande rm(). Elle procède à l’envers en supprimant la variable la plus
proche. Le même fonctionnement est utilisé pour les variables locales dans les
fonctions.
table
table <- 6
table
rm(table)
table
2
Partie 2: vecteurs et types
On crée un vecteur de valeurs tirées dans une loi binomiale: dix essais avec une
probabilité de 0,5 de succès à chaque essai.
a <- rbinom( 1000, 10, 0.5 )
a
Résumé numérique de la fonction. La fonction summary() donne un résumé
adapté à la nature des variables.
summary(a)
La comparaion a < 5 fournit un vecteur de booléen. Celui-ci est utilisé pour
indexer le vecteur. Les positions correspondantes à vrai sont donc renvoyées.
a[a>5]
Le même exercice est fait. On insiste ici sur le fait que la longueur du vecteur
obtenu correspond au nombre de valeurs TRUE.
length(a>5)
table(a>5)
length(a[a>5])
Ici on utilise l’opérateur de division entière pour sélectionner les nombres
pairs.
a[a%%2==0]
length(a[a%%2==0])
table(a[a%%2==0])
Le même exercice avec une loi normale.
a <- rnorm(1000)
table(a>0)
La fonction plot() avec un seul argument équivaut à appeler la fonction
plot(1:length(a),a).
3
plot(a)
Pour faire l’histogramme.
hist(a)
La fonction renvoie les positions telles que les valeurs a[order(a)] soient en
ordre croissantes. La fonction sort renvoie quant à elle le vecteur ordonné.
b <- order(a)
b
range(b)
On obtient le vecteur avec des valeurs croissantes.
a[b]
Avec cette procédure on obtient approximativement le premier quartile de
a.
c <- a[b][seq(1,length(a)*0.25,1)]
range(c)
quantile(a)
La fonction sample() permet de tirer au hasard des élements tirés d’un
vecteur donné. Il le fait sans remise. Par ce biais on crée un vecteur de longueur
2000 mélangeant deux lois normale de paramètres différents.
a <- c( rnorm(1000), rnorm(1000,3) )
a <- a[sample(1:2000,2000)]
Si l’histogramme on a un premier aperçu de la distribution.
hist(a)
En changeant le nombre de colonnes on a un meilleur aperçu de la distribution. Mais la fonction density() permet une meilleure approximation de la
distribution mais elle est plus complexe à interpréter.
hist(a,breaks=25,freq=F)
lines(density(a),col="red")
La fonction table permet de réaliser des tableaux de contingences.
a <- c( rep("Homme",1000), rep("Femme",1000) )
table(a)
table(a[a=="Homme"])
Soit une pièce à deux faces (0,1) on lance 1000 fois la pièce.
a <- c(0,1)
b <- sample( a, 1000, replace=T)
4
Le tableau de contingence correspondant:
b[b==0] <- F
table(b)
On tranforme la variable numérique en booléen
c <- rep( NA, 1000 )
c[b==1] <- T
c[b==0] <- F
table(c)
La même transformation avec la fonction conditionnelle ifelse(). Le premier
argument est un vecteur de booléen, le second une expression à réaliser pour les
valeurs vraie et le dernier pour les valeurs fausses.
d <- ifelse(b==0,F,T)
table(d)
Idem que précedemment. A noter la conversion implicite du booléen vers un
numérique.
a <- sample( c(T,F), 1000, replace=T )
table( a + 0 )
On crée un facteur de longueur 1000 contenant aléatoirement “Hommes”,
“Femmes” ou des valeurs manquantes.
a <- b <- c <- as.factor( sample( c("H","F",NA), 1000, replace=T ) )
On regarde le tableau de contingence. A noter que les valeurs manquantes
par défaut n’apparaisse pas. Pour les avoir il faut modifier le paramètre na.omit
de la fonction table(). On peut voir ensuite une conversion explicite entre des
facteurs et des entiers.
table(a)
table(as.numeric(a))
Ici on manipule les facteurs comme des entiers en utilisant une conversion
implicite.
b[b==1] <- "H"
table(b)
Idem. que précedemment
b[b+0==1] <- "H"
Idem que précedemment de façon explicite.
b[as.numeric(b)==1] <- "H"
5
On essaie de changer les valeurs manquantes pour ’A’. Mais n’étant pas une
des modalités possibles l’affectation n’est pas possible.
b[is.na(b)] <- "A"
Pour récupérer sous forme d’un vecteur character les différents niveaux d’un
facteur.
levels(a)
On ajoute ’A’ comme modalité. L’affectation devient possible.
c <- factor( c, levels=c(levels(a),"A") )
c[is.na(c)] <- "A"
table(c)
Autre variante pour ajouter une modalité. On passe par le biais d’un vecteur
character.
d <- as.character(a)
d[is.na(d)] <- "A"
d <- factor(d)
table(d)
3
Partie 3: data.frame
Données d’exemple de R du package de base, on peut accéder à iris une data.frame.
iris
La fonction head permet d’afficher les 6 (ou plus) premières lignes ce qui
donne un aperçu du fichier.
head(iris)
La fonction summary donne un aperçu des données: nombre de facteur,
quantiles,... En fonction du type de la colonne.
summary(iris)
Plus précis que la fonction précédente la fonction str() permet d’avoir une
description précise de l’objet. Cette fonction est capitale car elle peut être
utilisée sur tout objet R.
En en-tête on a le type d’objet: ici une data.frame de 150 lignes pour 5 colonnes.
Le dollar à chaque ligne indique qu’on peut accéder à la variable dont le nom suit
par son nom. Après chaque nom de variable on a le type de variable: numérique
pour les 4 premières puis un facteur de 3 modalités.
str(iris)
On accède à la variable Sepal.Length.
6
iris$Sepal.Length
Ainsi séparé de la data.frame, on obtient un vecteur de numérique (car c’est
le type de la variable dans la data.frame).
is.numeric(iris$Sepal.Length)
On fait l’histogramme et on regarde la densité.
hist(iris$Sepal.Length,freq=F)
lines(density(iris$Sepal.Length),col="red")
On visualise la structure d’une partie de la data.frame en sélectionnant les
colonnes par leurs noms.
str(iris[,c("Sepal.Length","Petal.Length")])
On visualise la structure d’une partie de la data.frame en sélectionnant les
colonnes par leurs numéros.
str(iris[,1:4])
On visulaise les 6 premières lignes de la data.frame.
iris[1:6,]
Pour récupérer ou affecter les noms aux colonnes, on utilise la fonction colnames().
colnames(iris)
Ici on voit un exemple de changement de nom des colonnes.
str(iris)
colnames(iris) <- c("LongueurSepal","LargeurSepal","LongueurPetale","LargeurPetale","Espe
str(iris)
On visualise les noms des lignes (ou individus).
rownames(iris)
On affecte ici des noms aux individus. On utilise la fonction paste pour
concatener deux variables textes. La fonction sprintf permet comme en C de
formater des nombres. Ici il y a trois chiffres complétés par des zéros en têtes
si nécessaires.
rownames(iris)
rownames(iris) <- paste( iris$Species, sprintf("%03d",1:100), sep="" )
rownames(iris)
Les variables ne sont accessibles qu’en préfixant par le nom de la data.frame.
La fonction with permet pour l’instruction contenu dans le deuxième argument
de ne pas préfixer par le nom de la data.frame.
7
table(Species)
table(iris$Species)
with(iris, table(Species) )
Ici on crée une data.frame et on rajoute une variable y (corrélée à x ici).
a <- data.frame(
id=1:1000,
x=rnorm(1000)
)
str(a)
a$y <- a$x*0.5+sqrt(1-0.5)*rnorm(1000)
str(a)
On utilise la fonction with pour créer un graphique de y en fonction de x et
tracer la droite de régression.
with( a, plot(x,y) )
abline(lm(y ~ x, data=a),col="red")
Ici un exemple d’indexation d’une data.frame par une matrice de booléen.
Toutes les cellules supérieurs à 0 reçoivent TRUE puis celles qui ne sont pas à
TRUE reçoivent FALSE. Les variables étant numériques il y a une conversion
implicite vers des numériques.
df <- data.frame(
a=rnorm(1000),
b=rnorm(1000),
c=rnorm(1000),
d=rnorm(1000)
)
df[df>0] <- T
df[df!=T] <- F
summary(df)
Dans ce cas on change le type vers un type booléen.
df$a <- as.logical(df$a)
df$b <- as.logical(df$b)
summary(df)
La fonction attach met la data.frame dans l’environnement et donc de ne
plus préfixer par le nom de la data.frame pour accéder aux variables.
attach(iris)
plot(Sepal.Length,Petal.Length)
La fonction detach() fait l’inverse.
detach(iris)
plot(Sepal.Length,Petal.Length)
8
La fonction dim donne les dimensions de la data.frame sous forme d’un
vecteur numérique avec en premier le nombre de lignes et en second le nombre
de colonnes. Les fonctions nrow et ncol permettent d’accéder aux dimensions
séparement.
dim(iris)
ncol(iris);nrow(iris)
Pour supprimer une colonne d’une data.frame il suffit d’y affecter la valeur
NULL.
iris$Sepal.Length <- NULL
str(iris)
4
Partie 4: Chargement et sauvegarde des objets
La fonction read.table est la principale commande qui sera étudiée pour charger
des fichiers. Elle permet de lire un fichier texte avec les valeurs séparés par un
caractère. Elle est pratique car elle permet de reconnaı̂tre automatiquement le
type de variables contrairement à la fonction scan de plus bas niveau.
Il existe plusieurs alias pour cette commande qui ne varie que par par les valeurs
par défaut.
Dans le premier exemple, on utilise la fonction par défaut avec comme séparateur
des tabulations et des points pour les décimales. La première ligne ne contient
pas les noms des colonnes que l’on définit dans un deuxième temps.
# Wagner, Compas et Howell (1988) [Wagn1988] ont étudié la relation entre le stress et la
# Le tableau contient les données concernant les mesures de stress et des sympt^
omes.
thc <- read.table("thc.txt")
colnames(thc) <- c( "stress", "symptomes" )
Le séparateur est ici un caractère dièse et on saute la première ligne qui sont
des commentaires.
# Waiting time between eruptions and the duration of the eruption for the Old Faithful ge
geyser <- read.table(file="geyser.txt", sep="#", skip=1 )
head(geyser)
Ici c’est un format proche du format CSV “français”. Le séparateur est un
point-virgule mais les décimales sont séparées par des points.
# Demographic Data: Population by year, methods and countries
pop <- read.table(
file="Population.txt",
sep=";",
dec=".",
header=T
9
/ United Nations Data
)
str(pop)
head(pop)
Ici c’est un format CSV français avec des points-virgules et des virgules
comme séparateur de décimales.
# Life expectancy at birth, males (years)
life <- read.csv2("life.txt")
Au format anglais: les virgules sont des séparateurs de champs et les points
les séparateurs de décimales.
# Schools that provided life skills-based HIV education in the last academic year / Unite
schools <- read.csv("schools.txt")
Par comparaison sur la taille des fichiers au format R et au format texte.
(load(gvhd10.RData)) # 1,5Mo
gv <- read.csv(file="gvhd10.txt",skip=4) # 9.5 Mo
Ici un fichier CSV “anglais”.
# Maunga Whau (Mt Eden) is one of about 50 volcanos in the Auckland volcanic field. This
volcano <- read.csv("volcano.txt")
filled.contour(as.matrix(volcano[,-1]), color.palette = terrain.colors, asp = 1)
Via Excel on sauvegarde le fichier au format CSV. Selon la nationalisation
il faut utiliser read.csv ou read.csv2.
# Reasons for Taking First Postdoctoral Appointment, by Field of Doctrate, 1997
?read.table -> postdoc.xls
On peut également sauvegarder le fichier Excel au format texte en utilisant
comme séparateur des tabulations.
# This is an updated and expanded version of the mammals sleep dataset. Updated sleep tim
? read.table -> msleep.xls
10