types de variables

Types usuels de données

Nous allons maintenant regarder plus précisément comment R stocke les divers type de données. Ce qui suit est une courte introcution aux divers types utlisés par R. Le but est de montrer les différents types de données que R peut prendre en compte.

Nombres

La manière la plus basique de stocker un nombre est de lui donner un nom avec la commande qui suit:

> a <- 3

>

On peut aussi utiliser le symbole "=" au lieu de "<-". Quand on fait une telle affectation d'un nombre ou autre chose à un nom de variable, R n'imprime aucune information particulière sur l'opération que l'on vient de faire. Si on veut avoir plus d'information, il suffit de taper le nom de la variable en ligne de commande:

> a

[1] 3

>

On peut réaliser bien évidemment toutes sortes d'opérations comme la racine carrée de a au carré plus 3 par exemple:

> b <- sqrt(a*a+3)

> b

[1] 3.464102

>

Si on veut une liste se rappeler de toutes les variables que l'on a utlisé lors de notre session R, il suffit d'utiliser la commande:

> ls()

[1] "a" "b"

>

Bien sur, nous ne sommes par limités à sauvegarder uniquement des nombres individuellement comme nous l'avons vu lors de la derniere session. On peut créer des "listes", encore appelées "vecteurs". On peut créer une liste avec la même commande "c" que tout à l'heure:

> a <- c(1,2,3,4,5)

> a

[1] 1 2 3 4 5

> a+1

[1] 2 3 4 5 6

> mean(a)

[1] 3

> var(a)

[1] 2.5

>

On peut avoir accès aux composantes de la liste (ou vecteur) de la manière suivante:

> a <- c(1,2,3,4,5)

> a[1]

[1] 1

> a[2]

[1] 2

> a[0]

numeric(0)

> a[5]

[1] 5

> a[6]

[1] NA

>

Bien sûr, comme le vecteur n'a que 5 composantes, lorsqu'on lui demande la 6ième, il répond qu'il n'est pas content, c'est à dire, dans son langage "NA".

Strings (Chaînes)

Nous ne sommes évidemment pas limités à stocker des nombres. On peut aussi stocker des chaînes de caractères (strings). Une chaîne est toujours prise entre guillemets. Notez que l'on peut utiliser indifféremment les 'guillemets simples' et les "guillemets doubles":

> a <- "hello"

> a

[1] "hello"

> b <- c("hello","there")

> b

[1] "hello" "there"

> b[1]

[1] "hello"

>

Facteur (factors)

On a vu le cas de listes de nombres et il faut maintenant voir le cas de liste qualitatives. Par exemples pour les personnes 1,2,3 et 4 on peut connaître l'expression du gène X mais on peut aussi connaître l'etat d'evolution d'une tumeur de l'organe Z (par exemple "superficielle" ou "invasive"), ou bien tout simplement la couleur des yeux (par exemple "bleu", "brun", "vert"). Bien sûr, on ne traite pas ces données comme si c'était des nombres et il faut dire à R qu'il s'agit de données d'un type différent: le type facteur (factor). Pour les yeux, on dira qu'il y a 3 niveaux (levels) correspondant à "bleu", "brun", "vert". Reprenons les données du data frame "vessie" de la session précédente. Pour l'état d'évolution de la tumeur de l'organe Z, il a 2 niveaux correspondant à "superficiel" ou "invasif".

Tapez par exemple:

> vessie$Cl.clinique

[1] sup sup inv sup inv sup sup sup inv inv inv sup sup inv sup sup sup inv

[19] inv inv inv sup sup sup inv sup sup sup sup sup inv sup sup sup sup sup

[37] sup sup sup sup inv sup sup sup sup sup sup sup sup inv sup sup inv sup

[55] sup sup sup sup sup sup sup sup sup inv inv sup sup inv sup sup sup sup

[73] sup sup sup sup sup sup sup sup sup sup inv inv sup inv sup sup sup sup

[91] sup sup inv inv sup inv sup sup sup sup

Levels: inv sup

> summary(vessie$Cl.clinique)

inv sup

24 76

Pour un facteur, "summary" nous donne l'effectif pour chaque niveau, c'est à dire,

combien d'"invasif" et combien de "superficiel".

Du fait que les données dans la "Cl.clinique" ne sont pas toutes des nombres, R assume automatiquement que les données qui ne sont pas des nombres sont des facteurs.

Pour un facteur a plus de deux niveaux, tapez par exemple:

> vessie$Stade

[1] pTa pTa >pT1 pTa >pT1 pTa pT1a pT1b >pT1 >pT1 >pT1 pT1a pTa >pT1 pT1b

[16] pTa pT1a >pT1 >pT1 >pT1 >pT1 pTa pT1a pT1a >pT1 pT1b pTa pT1b pTa pT1a

[31] >pT1 pT1a pTa pTa pTa pTa pTa pTa pTa pTa >pT1 pTa pTa pTa pTa

[46] pTa pT1b pT1b pTa >pT1 pTa pT1a >pT1 pT1b pTa pTa pT1a pT1a pT1 pT1b

[61] pTa pTa pTa >pT1 >pT1 pTa pTa >pT1 pTa pTa pTa pTa pTa pTa pTa

[76] pTa pTa pTa pTa pT1a pTa pT1a >pT1 >pT1 pTa >pT1 pT1b pT1 pTa pTa

[91] pT1b pTa >pT1 >pT1 pTa >pT1 pTa pT1b pTa pTa

Levels: pT1 >pT1 pT1a pT1b pTa

faisons l'analyse sommaire de ce facteur à l'aide de la function "summary":

> summary(vessie$Stade)

pT1 >pT1 pT1a pT1b pTa

2 24 12 11 51

Dans ces données, plusieurs colonnes sont des facteurs, mais les chercheurs ont utilisés des nombres entiers pour nommer les différents niveaux. Par exemple, la colonne "Cl.anapath" est composée des valeurs d'un facteur.

> vessie$Cl.anapath

[1] 1 1 3 1 3 1 2 2 3 3 3 2 1 3 2 1 2 3 3 3 3 1 2 2 3 2 1 2 1 2 3 2 2 1 1 1 1

[38] 1 1 1 3 1 1 1 1 2 2 2 2 3 1 2 3 2 1 2 2 2 2 2 1 1 1 3 3 1 2 3 1 1 1 1 1 1

[75] 1 2 1 1 1 2 1 2 3 3 1 3 2 2 1 1 2 1 3 3 1 3 1 2 1 2

si on fait "summary", on devrait trouver, comme pour les autres facteurs, le nombre de fois qu'on a eu "1", combien de fois on a eu "2" et combien de fois on a eu "3", non ?

> summary(vessie$Cl.anapath)

Min. 1st Qu. Median Mean 3rd Qu. Max.

1.0 1.0 2.0 1.8 2.0 3.0

... et bien non ! il croit qu'il a affaire à des valeurs numériques et donc il calcule la moyenne, la médiane, les quartiles, etc ... Notre tache est maintenant de faire comprendre à cette tête de mule que la colonne

"vessie$Cl.anapath" est un facteur !

En fait, cela n'est pas trop dur ...: il suffit d'utiliser la commande "factor". Dans l'exemple qui suit, nous convertissons la colonne vessie$Cl.anapath en un facteur:

> vessie$Cl.anapath<- factor(vessie$Cl.anapath)

> vessie$Cl.anapath

[1] 1 1 3 1 3 1 2 2 3 3 3 2 1 3 2 1 2 3 3 3 3 1 2 2 3 2 1 2 1 2 3 2 2 1 1 1 1

[38] 1 1 1 3 1 1 1 1 2 2 2 2 3 1 2 3 2 1 2 2 2 2 2 1 1 1 3 3 1 2 3 1 1 1 1 1 1

[75] 1 2 1 1 1 2 1 2 3 3 1 3 2 2 1 1 2 1 3 3 1 3 1 2 1 2

Levels: 1 2 3

> summary(vessie$Cl.anapath)

1 2 3

44 32 24

>

Une fois qu'un vecteur est converti en facteur, il est traité tout à fait différemment par R. Un facteur ne peut avoir qu'in ensemble fini de valeurs (ou niveaux), et cela n'a plus de sens de prendre leur moyenne, leur variance etc ... et R le sait ! La seule chose importante est de connaître leurs fréquences, ou "frequencies," qui apparaissent quand on tape la commande "summary".

Data Frames

Maintenant que nous avons vu que les données quantitatives sont dans des "listes" ou des "vecteurs" et que les données qualitatives sont dans des "facteurs", on se doute bien que dans les résultats pratiques, les deux sont mélangés et que par exemples, sur nos patients, on recueille aussi bien des données qualitatives que des quantitatives. Le type de variable qui permet d'avoir des tableaux avec les deux types de données (quantitatives et qualitatives) à la fois s'appelle "data frame".

Exemple:

> a <- c(1,2,2,1,3)

> b <- c(68,42,53,87,55)

> levels <- factor(c("I","S","S","I","S"))

> glurb <- data.frame(NombreTumeurs=a,Age=b,StadeTumeur=levels)

> glurb

NombreTumeurs Age StadeTumeur

1 1 2 A

2 2 4 B

3 3 6 A

4 4 8 B

> summary(glurb)

NombreTumeurs Age StadeTumeur

Min. :1.00 Min. :2.0 A:2

1st Qu.:1.75 1st Qu.:3.5 B:2

Median :2.50 Median :5.0

Mean :2.50 Mean :5.0

3rd Qu.:3.25 3rd Qu.:6.5

Max. :4.00 Max. :8.0

> glurb$NombreTumeurs

[1] 1 2 3 4

> glurb$Age

[1] 2 4 6 8

> glurb$StadeTumeur

[1] A B A B

Levels: A B

>

Tables

Une autre façon encore de stocker des informations est d'utiliser des tables. Nous allons regarder comment construire des tables à une puis deux dimensions.

One Way Tables (tables à une dimension)

Les tableaux à une seule dimension ne sont pas spécialement intéressants en pratique mais c'est un exemple simple pour commencer la présentation des type "table". Une façon de créer une table est d'utiliser la commande "table". Les arguments dont cette commande a besoin sont un vecteur de facteurs et les fréquences d'apparition de ces facteurs sont calculées automatiquement. Voici un exemple:

> a <- factor(c("A","A","B","A","B","B","C","A","C"))

> results <- table(a)

> results

a

A B C

4 3 2

> attributes(results)

$dim

[1] 3

$dimnames

$dimnames$a

[1] "A" "B" "C"

$class

[1] "table"

> summary(results)

Number of cases in table: 9

Number of factors: 1

>

Si on connaît déjà les fréquence pour chaque niveau du facteur, il est possible de créer une table directement, sans passer par la fonction "table". On crée d'abord une "matrice" de nombres. Une matrice est comme un vecteur, c'est à dire sous R une liste de nombres mais une matrice peut avoir deux dimensions. Dans notre exemple précédent, le nombre d'occurences de "A" est 4, le nombre d'occurences de "B" est 3, et le nombre d'occurences de "C" est 2. Nous allons créer une ligne de nombres. La première colonne contient un "4", la seconde "3", la troisième "2":

> occur <- matrix(c(4,3,2),ncol=3,byrow=TRUE)

> occur

[,1] [,2] [,3]

[1,] 4 3 2

La variable "occur" est donc une matrice avec une ligne et trois colonnes de nombres. Pour la transformer en table, il reste a relier les frequences que nous venons d'entrer aux niveaux auquels ces fréqences correspondent. Une fois que cela sera fait, on pourra convertir cette "matrice" en "table".

> colnames(occur) <- c("A","B","C")

> occur

A B C

[1,] 4 3 2

> occur <- as.table(occur)

> occur

A B C

A 4 3 2

> attributes(occur)

$dim

[1] 1 3

$dimnames

$dimnames[[1]]

[1] "A"

$dimnames[[2]]

[1] "A" "B" "C"

$class

[1] "table"

>

Two Way Tables (tables à deux dimensions)

Si vous voules ajouter des lignes a votre table, il suffit d'ajouter un argument à la commande "table". Dans l'exemple qui suit, nous avons affaire à deux questions. Pour la première questions, les réponses sont "Never," "Sometimes," ou "Always." Pour la seconde question, les reponses ont pour niveaux "Yes," "No," ou "Maybe." Les vecteurs "a," et "b," contiennent les réponses pour chaque mesure.

> a <- c("Sometimes","Sometimes","Never","Always","Always","Sometimes","Sometimes","Never")

> b <- c("Maybe","Maybe","Yes","Maybe","Maybe","No","Yes","No")

> results <- table(a,b)

> results

b

a Maybe No Yes

Always 2 0 0

Never 0 1 1

Sometimes 2 1 1

>

La commande "table" nous permet de faire rapidement des opérations intéressantes,et on peut rapidement voir que les personnes ayant répondu "Always" à la première question ont toutes répondu "Maybe" à la deuxième question.

Comme pour le case de la table à une dimension, il est aussi possible de rentrer nous même les éléments d'une table lorsque l'on connaît les fréquences. La procédure est exactement la même à l'exception que nous avons maintenant plus d'une ligne. Nous donnons un exemple rapide dans le cas d'un questionnaire pour lequel les facteurs sont le genre et le fait de fumer ou non:

> sexsmoke<-matrix(c(70,120,65,140),ncol=2,byrow=TRUE)

> rownames(sexsmoke)<-c("male","female")

> colnames(sexsmoke)<-c("smoke","nosmoke")

> sexsmoke <- as.table(sexsmoke)

> sexsmoke

smoke nosmoke

male 70 120

female 65 140



Pour retourner a la liste des TP, cliquer ici