Sunteți pe pagina 1din 82

Les objets file:///E:/25-07-2013 Pro/Thibault Pro/cours 13-14/logiciel stat/cours2/...

Les objets
[mode plan] | [mode texte]

es informations que l'utilisateur souhaite traiter sont contenues dans des objets. Ces derniers, identifiés par un nom, peuvent avoir des caractéristiques très différentes et être manipulés de manière à fournir l'information souhaitée par
l'utilisateur. L'objectif de cet E-thème est de vous familiariser avec les différents types d'objets, mais aussi avec leur gestion et leur manipulation.
Avant de commencer, vous devez effectuer les opérations suivantes afin de disposer de tout les éléments nécessaires à l'apprentissage de cet E-thème.
1. Créer un dossier propre à cet E-thème. Ce dossier servira à stocker les données et/ou les résultats manipulés durant une session de travail.
2. Dans ce dossier, placer le fichier donnees.txt . Il contient la définition des jeux de données utilisés au cours de cet E-thème.
3. Lancer RStudio ou R avec l'éditeur Tinn-R ou R avec un script R.
4. Indiquer le répertoire dans lequel vous allez travailler. Cette démarche s'effectue avec la commande setwd(). Par exemple, si votre répertoire se trouve à l'adresse "C:/etheme2/donnes/", la commande pour diriger R vers ce répertoire est
setwd("C:/etheme2/donnes/"). La gestion de l'espace de travail sera approfondie un peu plus loin.
5. Charger le code R qui permet de créer le jeu de données : source("donnees.txt").

Remarque : nous vous recommandons d'ouvrir un Script R (par exemple, depuis RStudio, faire File < New R Script) et de recopier dans ce script toutes les commandes qui sont fournies dans ce document.

1 - Typologie des objets

es objets sont identifiés par un nom, choisi par l'utilisateur. Ce nom peut contenir seulement des lettres, des chiffres et des points (utiles si l'on souhaite donner un nom composé). Dans le langage R, un objet appartient à un mode. Cette
définition d'un objet permet à R de définir "informatiquement" un objet en fonction du mode auquel il appartient. Par exemple, le mode d'un vecteur de réels est le même que le mode d'une matrice de réels, car le stockage d'un vecteur ou d'une
matrice dépend de la nature des éléménts qui constituent l'objet, ici nombre réel=mode numeric

Les principaux modes sont

numeric : vecteurs, matrices ou tableaux contenant des éléments réels


character : vecteurs, matrices ou tableaux contenant des chaînes de caractères
complex : vecteurs, matrices ou tableaux contenant des nombres complexes
logical : vecteurs, matrices ou tableaux contenant des booléens (TRUE ou FALSE)

Lorsqu'un objet contient au moins deux des modes cités ci-dessus, alors le stockage informatique des données se passe différemment et les modes possibles sont :

list
S3
S4
etc...

Enfin, le mode d'une fonction sera function pour signaler que le stockage informatique contient du code.

e mode d'un objet est obtenu avec la commande mode() (qui donne à peu près le même résultat que typeof() qui est un peu plus précis que le mode).

mode(vec)
mode(df)

onnaître le mode d'un objet renseigne finalement uniquement sur la nature "informatique" d'un objet. Pour donner plus d'informations sur la nature "statistique" et "mathématique" d'un objet, on définit la classe d'un objet. Par exemple, une
matrice (classe matrix) est un objet dont le mode est numeric, character, complex ou logical, mais dont on connaît le nombre de lignes/colonnes et potentiellement le nom des lignes et des colonnes.

On peut prendre également l'exemple d'une série temporelle. A priori, une série temporelle est un vecteur avec des valeurs numériques (soit le mode numeric). Maintenant, si on considère que cette série temporelle est trimestrielle, commence
le second trimestre de l'année 1959 et se termine le second trimestre de l'année 1965, alors on peut définir un objet de la class ts qui contient une information exhaustive des données statistiques.

# exemple de création d'une série temporelle


x.ts <- ts(1:25+rnorm(25),start=c(1959,2),frequency=4)
# représentation de cette série
plot(x.ts)

Les principales classes d'objet sont

matrix : matrice de valeurs numériques, de chaînes de caractères, de booléen, etc.


data.frame : jeu de données statistiques qui contient à la fois des variables quantitatives et qualitatives.
ts : une série temporelle
etc...

Pour connaîte la classe d'un objet, on utilise la fonction class().


Lorsqu'ils existent, pour connaîte les éléments "statistiques et "mathématiques" contenus dans un objet (et liés à la classe de l'objet), on utilise la fonction attributes().

# analyse du jeu de données df


class(df)
attributes(df)

# analyse de la série temporelle


class(x.ts)
attributes(x.ts)

Remarque : la différence entre le mode et la classe d'un objet est parfois confuse... A priori, on s'interessera dans ce cours davantage à connaître la classe d'un objet.

1.1 - Les vecteurs

1.1.1 - Présentation

es vecteurs peuvent contenir tout type (au sens du mode) de valeurs. Ils sont généralement construits à partir de la fonction collecteur c().

a.num<-c(1,3,5,6,8)

donnera un vecteur dont le mode est numeric alors que :

a.car<-c("AUREVILLE","AUSSONNE", "AUZEVILLE-TOLOSANE", "AUZIELLE")

donnera un vecteur dont le mode est character.

Le vecteur

a.bool<-c(TRUE,FALSE,FALSE,TRUE)

donnera un vecteur de logical.

On peut utiliser la fonction as.character pour transformer un vecteur de (numeric ou logical) en character.

as.character(a.num)
as.character(a.bool)

Pour transformer un character en numeric, cela est possible si et seulement si il s'agit de chiffres qui sont mis en caractères. Par exemple :

# cette instruction va produire un message d'avertissement


as.numeric(a.car)
# alors que cette commande marche
as.numeric(c("25.5","12.2","5"))

Pour transformer un (character ou un numeric) en logical, il faut que les chaînes de caractères soient égales à "TRUE" ou "FALSE" et que les valeurs numériques soients égales à 0 ou 1. Par exemple :
# cette instruction va produire des valeurs manquantes
as.logical(a.car)
# alors que ces commande marchent

1 sur 6 01/10/2013 22:21


Les objets file:///E:/25-07-2013 Pro/Thibault Pro/cours 13-14/logiciel stat/cours2/...

as.logical(c("FALSE","TRUE","FALSE"))
as.logical(c(0,1,0))

Dans la plupart des cas, les vecteurs sont utilisés pour stocker les observations d'une variable. Lorsque celle-ci est qualitative (les modalités pouvant être des nombres, par exemple 0 et 1 pouvant remplacer M/F), elle sera souvent utilisée
comme facteur et il peut donc être intéressant de le signaler. Ceci peut être fait de 2 manières à partir d'un vecteur qualitatif x avec les fonctions as.factor(x) et factor(x). L'avantage de la seconde est qu'elle dispose des options levels et
labels permettant à l'utilisateur de pouvoir préciser respectivement les différents niveaux de x (classés par ordre alphabétique) et les labels correspondants. Elle est donc très pratique pour effectuer un regroupement de modalités.

Remarque : le mode d'un objet de classe factor est numeric. Autrement dit, de façon "informatique", une modalité est attribuée à un nombre allant de 1 à K où K est le nombre de modalités.

y <- c("healthy", "healthy", "failing", "failing", "healthy", "failing", "healthy", "failing", "failing", "failing")
yf <- factor(y)
levels(yf)
class(yf)
mode(yf)
as.numeric(yf)

Plusieurs fonctions ou symbole sont prévues pour construire un vecteur ayant une forme particulière.

Les principaux sont

Pour construire un vecteur contenant 10 fois le nombre 2 :

rep(2,10)

Pour construire un vecteur qui répète 5 fois chaque élément d'un vecteur :

rep(a.num,each=5)

Pour construire la suite de 1 à n:

n<-10 ; 1:n

Pour construire la suite de 1 à n avec un pas de 2.

seq(1, n, by=2)

Pour construire (K-1) intervalles réguliers entre 1 et 10

K=20; seq(1, n, length.out=K)

Pour construire l'alphabet en lettres minuscules :

letters

l'alphabet en majuscules :

LETTERS

Pour construire un vecteur de 10 observations issues d'une N(0,1) :

x<-rnorm(n,0,1)

Pour concaténer des éléments entre eux à la suite, on utilise de nouveau la fonction c() : lorsque les éléments sont de mode différents (par exemple numeric et character), alors c'est le mode character qui l'emporte. Par
exemple, l'instruction suivante va créer un vecteur de character :

c(x,letters)

On peut également concaténer entre eux les éléments de plusieurs objets avec la fonction paste(). Dans le cas où la taille de chaque élément qu'on doit concaténer est différente, on répète chaque élément (équivalent de la
fonction rep()), de sorte que chaque élément soit de la taille de l'élément le plus grand. Finalement, on va créer un objet dont la taille est égale à l'objet qui a la plus grande taille. Mais rien ne vaut un exemple pour expliquer la
fonction paste() :

paste("L'observation numéro ",1:n,"(nombre", c("impair","pair"),")", "sur ",n, "est égal à" ,x)

Pour tirer aléatoirement 10 observations d'un échantillon de 100 issu d'une N(5,4) (Remarque : on précise en général dans la formule la variance alors que dans le code, on précise l'écart-type) :

x<-rnorm(100,5,2) ; sample(x,10)

1.1.2 - Manipulation des vecteurs

1.1.2.1 - Informations sur les vecteurs

lusieurs fonctions permettent d'obtenir des informations sur un vecteur, informations qui peuvent concerner ses attributs comme son contenu en lui-même.
Une première série de fonctions concerne les attributs du vecteur.
class(x) permet de savoir si le vecteur x peut être assimilé à une variable qualitative (un factor ou character) ou quantitative (un integer ou numeric).
length(x) permet d'obtenir sa longeur.
names(x) fournit, s'il existe, le nom des éléments d'un vecteur.
On obtient l'ensemble des valeurs prises par un vecteur par unique(x).
is.na(x) indique quels sont les éléments du vecteur x qui sont manquants au moyen des booléens TRUE (manquant) et FALSE (non manquant).

# penser à avoir éxécuter les instructions de déclarations de x et y ci-dessus


class(x)
class(y)
unique(y)
z<-c(x,NA,y)
length(z)
is.na(z)

Concernant le contenu d'un vecteur, les fonctions permettant d'en obtenir des informations ne sont pas les mêmes selon qu'il s'agisse d'une variable qualitative ou quantitative. Une des seules exceptions est peut être la fonction summary qui
donne la ventilation des individus entre les différentes modalités dans le premier cas, et les principaux quantiles dans le second.
En ce qui concerne les variables qualitatives, la fonction la plus utile est la fonction table(), qui fournit le tableau de fréquences absolues (ou des effectifs) du vecteur. Essayez :

# Ici, on voit l'intérêt d'utiliser l'option labels = de la fonction factor() pour ordonner les
# modalités.
x.qual<-factor(sample(c("petit","moyen","grand"),60,replace=T),labels=c("petit","moyen","grand"))
tab<-table(x.qual) ; tab

2 sur 6 01/10/2013 22:21


Les objets file:///E:/25-07-2013 Pro/Thibault Pro/cours 13-14/logiciel stat/cours2/...

Le tableau de fréquences relatives est obtenue avec la fonction prop.table() appliquée à un objet de classe table. La fonction addmargins() peut ajouter la colonne totale au tableau de fréquences (absolues ou relatives).

prop<-prop.table(tab)
prop
# on met dans un même tableau effectifs et fréquences
rbind(tab,prop)
# les effectifs avec le total
addmargins(tab)

Le tableau de fréquences cumulées s'obtient avec la fonction cumsum(). Remarque : on calcule les fréquences cumulées sur les modalités qui ont été triées, c'est pourquoi nous avons utilisé l'options labels= ci-dessus :

cumsum(prop)

our les variables quantitatives, les fonctions sont plus nombreuses. Prenons l'exemple d'un vecteur de taille 60 issu d'une N(100,20) :

x.quant<-rnorm(60,100,sqrt(20))

La moyenne est obtenue par la commande mean(x.quant).


La somme est obtenue par la commande sum(x.quant).
La médiane est obtenue par la commande median(x.quant).
L'écart-type (resp. variance) est obtenu par la commande sd(x.quant) (resp. var(x.quant)).

Remarque : calculer vous-même la variance de x.quant en utlisant les fonctions mean() et sum(). Que constatez-vous ?

Le minimum (resp. maximum) est obtenu par la commande min(x.quant) (resp. max(x.quant)) et la fonction range(x.quant) donne à la fois le minimum et le maximum.
Le quantile d'ordre Q (0 < Q < 1) est obtenu par la commande quantile(x.quant,Q). Par défaut quantile(x.quant) retourne les quantiles d'ordre 0, 25%, 50%, 75%, 100%.

Remarque : il y a plusieurs façons de calculer les quantiles. Pour les connaître, faites help(quantile).

1.1.2.2 - Les opérations élémentaires

outes les opérations élémentaires (+,-,*,/) peuvent être appliquées sur les vecteurs (numériques). Les opérations sont alors effectuées élément par élément. Prenons l'exemple des vecteurs x (1,0,1,1,1) et y (1,1,0,0,1).

x<-c(1,1,1,1,1)

y<-c(1,1,0,0,1)

La commande :

z<- 2*x + 3*y - x*y + 1

affecte au nouvel objet z le vecteur (de longueur 5)

2 +3 - +

Il existe un certain nombre de commandes correspondant à des fonctions mathématiques et qui appliquées à des vecteurs, effectuent le calcul sur chaque élément du vecteur :

exp(1:10)
cos(seq(0,pi,length.out=8))
asin(0.5)
tan(pi/2)
log(100)
log10(c(10,100,1000))

1.1.2.3 - L'extraction d'un sous-ensemble

n sous-ensemble d'un vecteur peut être extrait en plaçant entre crochets un vecteur contenant les indices correspondant aux valeurs que l'on souhaite garder.
On peut par exemple extraire les 1er, 2ème, 4ème et 6ème valeurs du vecteur

x<-c(1,2,3,4,5,6,7,9,11)

par la commande :

x[c(1:2,4,6)]

A l'inverse, il est possible d'exclure ces mêmes valeurs en plaçant le signe "-" avant le vecteur d'indices :

x[-c(1:2,4,6)]

On peut également vouloir extraire d'un vecteur des éléments ayant une certaine caractéristique. Dans ces conditions, le procédé est le même en substituant le vecteur d'indice par une condition (employant les opérateurs logiques "<=", "==", "
!=" et ">="). Prenons les vecteurs :

x <- c(1,5,3,6,4,7,2,1)
y <- c("oui","non","oui","oui","non","non","oui","oui")

On extrait du vecteur x les valeurs inférieures ou égales à 3 par la commande :

x[x<=3]
# qui consiste à renvoyer les éléments de x qui prennent les valeurs TRUE du vecteur suivant :
x<=3

et les valeurs égales à oui de y par :

y[y=="oui"]
# qui consiste à renvoyer les éléments de y qui prennent les valeurs TRUE du vecteur suivant :
y=="oui"

3 sur 6 01/10/2013 22:21


Les objets file:///E:/25-07-2013 Pro/Thibault Pro/cours 13-14/logiciel stat/cours2/...

1.1.2.4 - Modification de vecteurs

'autres fonctions permettent de réorganiser un vecteur.


sort(x) et order(x) classent respectivement les éléments et les indices du vecteur x, de telle sorte que le vecteur x soit trié par ordre croissant. rev() permute les éléments de x (équivalent à la commande x<-x[n:1])
sample() génère un nouvel échantillon à partir des éléments du vecteur.

1.2 - Les matrices

1.2.1 - Présentation

es matrices sont les objets permettant de stocker des matrices. Les données à l'intérieur peuvent être de tout mode, mais celui-ci doit être le même. En règle générale, elles sont surtout utiles pour contenir des variables quantitatives,
chaque vecteur ligne donnant les observations d'un individu sur ces variables.
Une matrice se construit à l'aide de la fonction matrix() (ou as.matrix(x)), à partir du vecteur x contenant les données.
Par exemple, la matrice se construit par la commande

X<-matrix(c(1,2,3,4,5,6),ncol=3,byrow=T)
# équivalent à
X <- matrix(c(1,4,2,5,3,6),2,3)

1.2.2 - Manipulation des matrices

ors de ce paragraphe, les exemples donnés seront basés sur l'utilisation des matrices

Un premier exercice va consister à les construire.

1.2.2.1 - Informations sur les caractéristiques d'une matrice

es principales caractéristiques d'une matrice, la matrice A en ce qui nous concerne, sont données par :
dim(A) dimension de A (nombre de lignes, nombre de colonnes). Ces 2 informations peuvent être obtenues séparément par les commandes nrow(A) et ncol(A).
rownames(A) et colnames(A) renvoie le nom des lignes et des colonnes de A. Par défaut, ces dernières ne sont pas renseignées. Cela peut se faire par les commandes :

X
rownames(X)<-c("ind1","ind2")
colnames(X)<-paste("V",1:3,sep="")
X

1.2.2.2 - Les opérations élémentaires

es opérateurs élémentaires +, -, * et / réalisent les opérations terme à terme, sous réserve que les 2 matrices soient de la même dimension. Il est par contre possible d'effectuer une opération entre un scalaire et une matrice. A l'instar de ce
que nous avons vu pour les vecteurs, la commande 1 + 2*A effectuera la somme des matrices

Pour le produit de matrice, il faut utiliser l'opérateur %*%, toujours sous réserve de l'adéquation des dimensions (dans notre exemple, cela donne A%*%B).

La fonction crossprod(X,A) permet de faire le produit matriciel : X x t(A).

1.2.2.3 - L'extraction d'un sous-ensemble

ous avons vu que l'on pouvait extraire d'un vecteur quelques éléments. Pour les matrices, l'opération est identique, à la différence près que l'on doit indiquer entre crochet les individus et les variables à retenir.
Par exemple, les observations de la 2ème et de la 3ème variable contenues dans la matrice A pour le 2ème individu sont données par :

A[2,c(2,3)]

Si l'on souhaite garder une ligne ou une colonne entière, il suffit de laisser vide l'espace des colonnes ou des lignes. La deuxième variable de la matrice A est obtenue par la commande A[,2].

1.2.2.4 - L'extraction d'informations

ous avons vu qu'une matrice servait souvent à stocker les observations sur des individus de plusieurs variables. Il est donc intéressant de savoir extraire des informations sur chacune des colonnes. Par ailleurs, les fonctions traditionnelles
(sum(), sd(), mean(), etc) considèrent une matrice de dimension (n,p) comme un vecteur de longueur n*p. Aussi, pour obtenir des informations sur chacune des colonnes, il est nécessaire d'utiliser la fonction apply().
Par exemple la somme des colonnes de la matrice A peut être effectuée par la commande :

apply(A,2,sum)

Le premier argument correspond au nom de la matrice, le second au type de calcul (1 pour un calcul par ligne et 2 pour un calcul par colonne) et le dernier argument correspond à la fonction à appliquer.

1.2.2.5 - Autres fonctions relatives aux matrices

es fonctions ci-dessous sont très souvent utilisées lorsque l'on manipule des matrices.
t(A) Transposé de la matrice A.
solve(A) Matrice inverse de A où A doit être une matrice carrée bien conditionnée.

solve(A%*%B)

solve(A,b) donne le vecteur x qui résoud l'équation Ax=b où A est une matrice carré. Il est plus intéressant de donner le résultat ainsi plutôt que solve(A)%*%b qui est pourtant équivalent mais moins stable numériquement.

solve(A%*%B,c(1,1))
# équivalent mais plus stable que :
solve(A%*%B)%*%c(1,1)

diag(A) Si A est une matrice carrée, le résultat est la diagonale de la matrice A. Si A est vecteur, le résultat est une matrice diagonale avec le vecteur A sur la diagonale.

diag(A%*%B)
diag(1:5)

cbind() et rbind() Concaténation (verticale et horizontale) de matrices. Ces deux fonctions marchent également avec des data frame.

1.3 - Les listes

es listes sont des ensembles ordonnés d'objets de tout type (vecteur, matrice, ... et même liste).
Ainsi, l'objet ex.liste ci-dessous a pour composant :
1. nom Nom de la personne (chaine de caractères)
2. prenom Prénom de la personne (chaine de caractères)
3. age Age de la personne (scalaire)
4. note Résultats des 5 contrôles de Data Mining, Credit Scoring et Sondages (matrice)

Cet exemple, comme toutes les listes, est construit à l'aide de la fonction list.

note<-matrix(c(5,6,4,11,9,10,12,8,9,11,7,8,6,8,7),ncol=3)

colnames(note)<-c("DataMining","Scoring","Sondages")

row.names(note)<-1:5

4 sur 6 01/10/2013 22:21


Les objets file:///E:/25-07-2013 Pro/Thibault Pro/cours 13-14/logiciel stat/cours2/...

ex.liste<-list(nom="Tergal",prenom="Jean-Claude",age="23",note=note)

Le contenu obtenu est :

$nom
[1] "Tergal"

$prenom
[1] "Jean-Claude"

$age
[1] "23"

$note
DataMining Scoring Sondages
1 5 10 7
2 6 12 8
3 4 8 6
4 11 9 8
5 9 11 7

Les différents composants de cet objet ont chacun un nom (comme c'est le cas ici) ou sont indicés à l'aide de double crochets (le premier élément serait indicés par [[1]]). Pour pouvoir accéder à l'un des éléments directement, le signe $ est
utilisé. Par exemple, ex.liste$note contient la matrice des notes.
Les deux principales caractéristiques d'un objet de type list sont sa longueur (obtenue par length(ex.liste)) et le nom de ses composants (names(ex.liste)). De nouveaux éléments peuvent être rajoutés à l'aide du symbole $. Dans notre
exemple, on peut rajouter le composant origine, indiquant l'origine de l'élève, avec l'instruction

ex.liste$origine<-c("Ronchin","Haute-Garonne","Midi-Pyrénées")

De par sa nature, un objet de type list est donc idéal pour stocker des informations de différente nature sur un individu, un phénomène, ... Il sera notamment très utile pour stocker les résultats lors de la construction d'une fonction (dont nous
verrons les grands principes lors de l'E-thème suivant).

Pour appliquer une fonction à chaque élément d'une liste, on utilise la fonction lapply() avec comme premier agrument le nom de la liste et comme second argument, la fonction à appliquer à chaque élément de liste.

lapply(ex.liste,length)

1.4 - Les data-frames

1.4.1 - Présentation

es data.frames (ou structure de données) sont les objets les plus importants dans R. Ce sont des tableaux dont les colonnes, à l'inverse des matrices, peuvent être de différents types. Cela permet donc de pouvoir disposer, dans un seul objet,
des observations sur de nombreux individus de variables quantitatives et qualitatives, formes habituelles d'un jeu de données.

La construction d'une data frame peut se faire en contraignant un objet à devenir une structure de données (avec as.data.frame()) ou, ce qui est plus rare, en la construisant directement avec la fonction data.frame(). Mais la plupart du
temps, les data frames proviennent de l'importation d'un jeu de données (voir le paragraphe Importation et Exportation de données import).
Si l'on considère les vecteurs :

V1<-1:10
V2<-(1:10)/3
V3<-letters[1:10]

on peut faire une data frame de la concaténation horizontale de ces 3 vecteurs par l'instruction :

data.frame(V1,V2,V3)

Si l'on considère maintenant la matrice

A<-matrix(c(V1,V2,V3), ncol=3)

qui ne contient que des chaines de caractères étant donnée la présence du vecteur V3, l'instruction :

A<-as.data.frame(A)

en fait une structure de données. A première vue, les deux premières colonnes de A sont numériques mais le code suivant nous indique que ce n'est en fait pas le cas :

class(A[,1])
class(A[,2])

1.4.2 - Extraction d'informations d'une data frame

out comme pour les matrices, un certain nombre de fonctions permettent de connaitre certaines propriétés d'une data frame. En soumettant le fichier donnees.txt au tout début de l'E-thème, vous avez chargé la structure de données "df".
C'est sur cette dernière que l'on va travailler maintenant.
les fonctions nrow() et ncol() permettent d'obtenir respectivement le nombre de lignes et de colonnes.
names() et row.names() fournissent le nom des variables en colonnes et des identificateurs d'individus en ligne.
Il est également possible d'obtenir des informations sur les variables contenues dans la structure de données avec les fonctions str() et summary(). Ainsi :

str(df)

renseigne sur la nature des variables (quantitative ou qualitative) et :

summary(df)

donne la distribution des variables quantitatives et la répartition par modalité des variables qualitatives.

1.4.3 - Manipulation d'une data frame

l'inverse d'une matrice, on ne peut pas effectuer d'opération sur une data frame. Par contre, on peut en extraire certaines variables, comme pour les matrices par le symbole $ ou par les crochets. Par exemple la variable IMP est extraite par

df$IMP
# équivalent à
df[,"IMP"]
# équivalent à
df[,17]

Il est également possible de transformer temporairement en variable toutes les composantes d'une data frame. Pour cela, il suffit d'utiliser la fonction attach(). En éxécutant attach(df), vous verrez que vous disposez maintenant d'autant de
vecteurs qu'il y a de variables, vecteurs que vous pouvez manipuler. Ainsi, au lieu de taper sum(df$JA1) pour avoir le total de la variable JA1, il vous suffit de taper sum(JA1). Cependant, les modifications qui pourraient avoir lieu sur ces variables
ne seront pas prises en compte. En effet, lorsque vous tapez ls(), la variable JA1 n'apparaît pas parmi les objets créés. La raison est que les variables sont provisoirement stockées dans un environement "parallèle" dans lequel l'utilisateur ne
peut pas accèder directement... Pour effacer toutes ces "nouvelles" variables, il suffit d'éxécuter detach(df).
Enfin, pour être complet, sachez qu'il est possible de rajouter des colonnes à une data frame. Si par exemple, dans la table df, on veut ajouter la variable , il suffit de taper l'instruction

df$JA = df$JA1 +df$JA2 + df$JA3

5 sur 6 01/10/2013 22:21


Les objets file:///E:/25-07-2013 Pro/Thibault Pro/cours 13-14/logiciel stat/cours2/...

On peut aggréger un jeu de données (on construit donc un nouveau jeu de données dans la mesure où l'unité observée sera différente), en fonction d'une variable qualitative. Par exemple dans le jeu de données df, on souhaite aggréger toutes
les variables quantitatives (ici calculer la somme de ces variables) en fonction de l'heure de la semaine. Pour cela, on utilise la fonction aggregate(). On pourra remarquer que la variable qui a servi à aggréger le jeu de données est une liste.
Cela permet d'aggréger potentiellement en fonction de plusieurs variables qualitatives.

aggregate(df[,1:11],df[,"TrH"],sum)

On considère un jeu de données qui est disponible par défaut sur R et qui donne des informations (taille des pétales, des sépales, etc.) sur 150 fleurs qui appartiennent à 3 espèce différentes. Pour le charger dans R :

data(iris)
# on notera qu'en tapant data(), on peut visualiser tous les jeux de données qui sont fournis avec R sous forme de data frame

On souhaite connaître la taille moyenne des pétales et des sépales en fonction de la variété de la fleur. Pour cela, on utilise la fonction by()

by(iris[,c("Sepal.Length","Petal.Length")],iris[,"Species"],mean)

On peut changer dans le code ci-dessus la fonction mean() par une autre fonction.

6 sur 6 01/10/2013 22:21


Les objets file:///E:/25-07-2013 Pro/Thibault Pro/cours 13-14/logiciel stat/cours2/...

Les objets

[mode plan] | [mode texte]

2 - Gestion des objets : Entrée - Sortie

ette section est dédiée à la gestion des objets dans R. Son apprentissage doit vous permettre de vous
familiariser avec les outils permettant de sauvegarder et de charger des objets. Par ailleurs, R étant
avant tout un logiciel de traitement de données, un paragraphe sera consacré à la gestion des jeux de
données (importation, exportation).

2.1 - Enregistrement et chargement des objets

’enregistrement d’un objet dans R est très simple. Il se fait à l’aide de la fonction save() en précisant
comme premier argument, l’objet à sauvegarder et avec l'argument file= le nom du fichier (avec
l’extension .RData). Lorsque vous redémarrerez une session, il suffira alors d’utiliser la fonction load()
en précisant l’adresse complète du fichier à charger.
Reprenons l’objet ex.liste de la section précédente. La sauvegarde de cet objet s’effectue par
l’instruction save(ex.liste,file="sauvliste.RData").

ors d’une nouvelle session, load("C:/.../sauvliste.RData") chargera l’objet ex.liste.

Une autre manoeuvre consiste à sauvegarder la totalité des objets créés lors d’une session par la
commande save.image("C:/.../sauv.RData") et de charger cette dernière lors d’une nouvelle session
(load("C:/.../sauv.RData")). Ce procédé peut être utile lorsque l’on souhaite sauvegarder un
nombre important d’objets. On notera que lorsque vous quittez une session R, vous avez une fenêtre
qui s'affiche en disant : "Sawe workspace image". Si vous dites "oui", cela revient à exécuter la
commande save.image(). Il a cependant l’inconvénient de charger à l’ouverture de la nouvelle session
plusieurs objets "parasites" inutiles pour l’utilisateur.

2.2 - Importation et Exportation de données

l est très rare, lors d’une analyse statistique, que le jeu de données sur lequel est basée cette étude
soit directement utilisable. Dans la grande majorité des cas, un "nettoyage" et/ou une fusion de
plusieurs tables s’imposent. Si R peut très bien remplir cette tâche, ce n’est pas son but premier, et il
est préférable d’utiliser d’autres outils plus adaptés pour effectuer cette démarche préalable. En
conséquence, il est nécessaire de bien connaître les outils pour importer des fichiers de données autres
que ceux dont le format est reconnu par le logiciel. D’autre part, toutes les personnes ne travaillent pas
avec le même logiciel, il peut être utile de connaître les fonctions permettant de "rapatrier" des données
d’autres logiciels de statistiques. C’est ce que nous verrons dans un deuxième temps.

2.2.1 - Importation et Exportation de fichier-texte

es fonctions permettant de lire des données dans un fichier texte sont nombreuses et efficaces dans
R. C’est pourquoi il est très pratique, entre le fichier de données nettoyé (au format xls par exemple) et
la table dans R, de passer par l’intermédiaire d’un fichier-texte. Cela est d’autant plus pratique que la
plupart des logiciels laissent la possibilité d’enregistrer les tables au format ".txt".

1 sur 5 01/10/2013 22:22


Les objets file:///E:/25-07-2013 Pro/Thibault Pro/cours 13-14/logiciel stat/cours2/...

Une fois que vous disposez de votre fichier-texte, vous pouvez le lire avec la fonction read.table().
Cette fonction (qui renvoie une matrice ou une data frame) admet un seul argument obligatoire : le
nom du fichier-texte (précédé éventuellement du chemin d’accès). Les autres arguments servent
àpréciser certains codes utilisés dans le fichier (indicateur de séparation, représentation des valeurs
manquantes, des virgules ...). Si le fichier-texte respecte les valeurs par défaut de cette fonction, aucun
de ces arguments n’est utile. Malheureusement, ce n’est pas le cas des fichiers-texte issus d’autres
logiciels.
Prenez les fichiers dontxt0.txt et dontxt.txt et placez les dans votre répertoire de travail. Le
premier est un modèle du genre. En effet, les observations qualitatives sont entre guillemets, le signe
décimal est celui par défaut (à savoir "."), ... ce qui n’est pas du tout le cas du second. Cette différence
a une conséquence immédiate sur le résultat de la fonction read.table. Si vous exécutez les
instructions ci-dessous...

don.txt0<-read.table("dontxt0.txt")
# pour afficher les premières lignes du jeu de données créé
head(don.txt0) # le jeu de données est correct

don.txt<-read.table("dontxt.txt")
head(don.txt) # le jeu de données a plusieurs couacs ...

....vous voyez tout de suite que la table dontxt n’est pas conforme. En effet,
La première ligne contenant le nom des variables est considérée comme une observation. Pour
éviter cela, il faut indiquer que cette ligne contient le nom des variables par l’ajout de l’argument
header=TRUE.
Le signe de virgule "," n’est pas celui par défaut. Il est donc nécessaire de l’indiquer (option
dec=",").

don.txt<-read.table("dontxt.txt",header=TRUE,dec=",")

Remarque : pour la lecture du premier jeu de données, il n'était pas nécessaire d'ajouter l'option
header=TRUE. En effet, la première ligne du fichier "dontxt0.txt" contient seulement une valeur de
moins que le nombre de colonnes dans le fichier. Aussi, R a compris directement que la première ligne
contenait le nom des variables et que la première colonne n'était pas une variable mais correspondait
au nom des individus. Ainsi, la première colonne du fichier n'apparaît pas sous forme d'une variable,
mais sous forme de row.names(don.txt0).

Ces précisions ont permis d’obtenir une table propre. Mais maintenant, il s’agit de vérifier (ceci peut
être fait avec la fonction str()) que les types des variables en colonnes sont justes. Or, dans un cas
comme dans l’autre, ce n’est pas le cas. La variable IMP, variable catégorielle mais dont les modalités
sont des entiers, a été considérée comme numérique. A l’issue d’une instruction read.table(), il
est donc impératif de vérifier la nature des variables. Dans notre cas, cette vérification nous
amène à modifier la variable IMP.

don.txt$IMP<-as.factor(don.txt$IMP)
don.txt0$IMP<-as.factor(don.txt0$IMP)

Il existe d’autres fonctions permettant de lire des données dans un fichier-texte. Elles sont toutes plus
ou moins proches de read.table car elles ne différent que par la présence d’une option supplémentaire.
Parmi elles, on peut citer scan, read.csv, read.delim, read.fwf. Il est bon de les connaître (si leur
utilisation est vraiment nécessaire), mais dans la grande majorité des cas, la fonction read.table est
suffisante pour arriver à ses fins.

On peut également citer la fonction read.csv2(), qui marche très bien lorsqu'on a sauvegardé un
fichier sur Excel au format .csv (séparateur point-virgule).

2 sur 5 01/10/2013 22:22


Les objets file:///E:/25-07-2013 Pro/Thibault Pro/cours 13-14/logiciel stat/cours2/...

L’exportation de données vers un fichier-texte se fait au moyen de la fonction write.table(). Les deux
arguments obligatoires sont le nom de l’objet à exporter (matrice ou data frame) et le nom du fichier
qui le contiendra. Les autres arguments sont les mêmes que ceux de la fonction read.table(), i.e.
qu’ils servent à définir différents codes. Pour continuer avec l’exemple ci-dessus, on enregistre la
table txt en donnant l’instruction write.table(txt,"C:/.../fichier.txt").

2.2.2 - Importation de données d’un autre logiciel statistique

n module a été spécialement conçu pour pouvoir importer des fichiers de données produit par
d’autres logiciels statistiques. Il s’agit de la librairie foreign, librairie intégrée à la version de base de R.
Noter toutefois qu'il faudra la charger avant chaque utilisation par :

library("foreign")

Plusieurs systèmes statistiques sont pris en compte (Minitab, SPSS, Stata, SAS, ...), mais nous n’en
verrons ici que quelques uns. Avant de commencer, il faut savoir qu’étant donné leur coût, il est très
rare que plusieurs logiciels statistiques cohabitent. Cependant, il peut arriver que ce module soit utile si
un travail est effectué à plusieurs dans différents environnements.

De plus, certaines revues statistiques comme CSBIGS ou JSS éditent des articles qui sont
très appliqués. Pour pouvoir vérifier les résultats obtenus dans ces études, la publication des jeux de
données est obligatoire et leur format (même si la plupart du temps les données sont au format xls)
dépend du logiciel qui a été utilisé par les chercheurs . Dans ce cas, la bibilothèque foreign peut être
fort utile.

2.2.2-1 - SAS

’importation de fichier de données SAS est assez laborieuse et possède un inconvénient : il est
obligatoire de posséder SAS sur son ordinateur. Pour les personnes qui n'ont pas pu installer SAS, on
peut utiliser l'outil SAS Viewer , directement téléchargeable sur le site de SAS. Un fichier de
données SAS porte l'extension .sas7bdat.

La procédure se déroule en deux temps. Tout d’abord, dans SAS (ou dans SAS viewer), il faut
transformer la table de données (au format .sas7bdat) en une table au format ".csv". Cette première
phase peut s’effectuer en faisant du clique-bouton à l'aide du menu SAS (Fichier < Exporter données <
...). Ensuite, R est capable de reconnaitre le format "csv" et de le transformer en un objet grâce à la
fonction read.csv2().

3 sur 5 01/10/2013 22:22


Les objets file:///E:/25-07-2013 Pro/Thibault Pro/cours 13-14/logiciel stat/cours2/...

Un fichier de données SAS peut contenir certaines informations sur les variables. Par exemple, une
variable peut être définie comme une date (JJ/MM/AAAA). Dans ce cas, on peut préférer convertir le
fichier "sas7bdat" en un fichier de transport "xpt" qui sera ensuite lisible sur R. Dans SAS, if faut
exécuter les lignes suivantes :

libname src2rd 'répertoire_où_se_trouve_la_table_SAS';

libname rd xport 'destination_de_la_table_XPT/nom_fichier.xpt';

proc copy in=src2rd out=rd;

select nom_de_la_table_SAS_à_transformer;

run;

Avec ce code, SAS créé en fait deux nouvelles librairies : l’une (src2rd) dans laquelle il va copier la table
d’origine et l’autre (rd) dans laquelle il va mettre la table finale (au format XPT). L’utilisateur doit
indiquer le chemin d’accès à la table SAS, le nom du fichier XPT qui sera créé (avec chemin d’accès), et
le nom de la table SAS à transformer.
Si l’on prend la table de données donsas , cela donne :

* code testé sur la version 9.3 ;

libname src2rd 'C:/Users/laurent/Documents/My SAS Files/9.3/';


libname rd xport 'C:/Users/laurent/Documents/donsas.xpt';

proc copy in=src2rd out=rd;


select donsas;
run;

Même si je n'y suis pas arrivé, cette première phase devrait pouvoir être réalisée depuis R avec la
fonction read.ssd(). Cependant, il est quand même nécessaire de posséder SAS sur son ordinateur et
de mettre le répertoire où se trouve l'executable de SAS dans le path.
Suite à cela, il reste à convertir le contenu du fichier XPT en un objet R avec la fonction read.xport, qui
a pour argument le nom du fichier donsas.xpt .

don.sas<-read.xport("donsas.xpt")

Cette procédure est donc assez lourde et il est possible de rencontrer quelques problèmes (voir
l'exemple ci-dessus). Il est donc préférable de passer par l’intermédiaire de fichiers csv.

2.2.2-2 - Stata

l’inverse de SAS, l’importation de données de Stata est très pratique. Si l’on considère les données

4 sur 5 01/10/2013 22:22


Les objets file:///E:/25-07-2013 Pro/Thibault Pro/cours 13-14/logiciel stat/cours2/...

contenues dans la data frame automiss.dta (extrait du site de Stata ), l’importation se


réalise avec la fonction read.dta comme suit :

automiss<-read.dta("automiss.dta")

2.2.2-3 - SPSS

PSS, comme Stata, ne pose aucun problème d’importation. Pour la table donspss , le code est

don.spss<-read.spss("donspss.sav",to.data.frame=T)

L’option to.data.frame=T est obligatoire, sinon l’objet créé est une liste.

Si le module foreign fournit des fonctions pratiques (notamment pour Stata et SPSS), comme nous le
disions dans l’introduction, il est très rare de s’en servir. Il est donc beaucoup plus important de savoir
maîtriser l’importation de fichier-texte-xls-csv.

5 sur 5 01/10/2013 22:22

S-ar putea să vă placă și