Quelques liens utiles

R vu comme une calculatrice

Le symbole “>” est l’invite de commande (“prompt”) de R. Ilsignifie que R est prêt à recevoir une nouvelle instruction. Exemple:

## Quelques calculs
2 + 3
## [1] 5
2 * 3
## [1] 6
2 / 3
## [1] 0.6666667

Terminez votre commande !

Quand vous entrez une commande incomplète, R affiche une invite +, qui indique qu’il attend que vous complétiez votre commande

2 *

Si vous êtes coincés avec une invite +, vous devez terminer la commande pour vous tirer d’affaire. Dans ce cas-ci, tapez par exemple taper 7 puis ENTER.

Pendant le calcul, pas d’invite de commande

Si on envoie à R un calcul qui dure un certain temps, pendant le calcul il n’affiche aucun symbole d’invite de commande.

Un exemple de commande qui prend quelques secondes (nous expliquerons plus bas en quoi consistent ces fonctions).

Note: le symbole # permet d’écrire des commentaires, i.e. du texte non interprété par R.

## Calculer la moyenne de 100 millions de nombres 
## tirés au hasard selon une distribution normale
mean(rnorm(100000000))
## [1] 0.0002319518

Pendant quelques secondes rien ne se passe … puis la réponse s’affiche.

Utiliser des variables

Le symbole <- assigne une valeur à une variable. Si cette variable n’a pas encore déclarée, elle est créée au passage (un espace mémoire lui est réservé).

a <- 2  ## Assignation d'une valeur à une variable
b = 3   ## Notation équivalente acceptée mais pas recommandée

Nommer ses variables avec des noms informatifs

Plutôt que a,b,c , on recommande de nommer les varables de façon explicite

resultat <- a * b + a + b  ## Le résultat est stocké dans une variable nommée resultat 
print(resultat)
## [1] 11

Attention ! Les noms de variables sont sensibles à la casse ! La commande suivante retourne une erreur.

print(Resultat)

Error in print(Resultat) : object ‘Resultat’ not found

Ne pas exagérer dans la longueur des noms de variables sinon cela nuit à la lisibilité du code, comme quand on fait des titres à rallonge qui n’aident pas non plus

ma_nouvelle_variable_avec_un_nom_a_rallonge <- 10

Noms réservés

Attention: certains noms sont déjà utilisés pour des fonctions/objets R. Il ne faut donc pas les utiliser comme noms de variables. On les qualifie de noms réservés.

c # créer un vecteur
t # transposer une matrice
sum # fonction somme
mean # fonction moyenne

TRUE # booléen
FALSE # booléen
T # booléen
F # booléen

NA # not available
NaN # not a number (par exemple log(-1))
Inf # infini (par exemple 1/0)
NULL # objet nul

pi # 3.14...
letters # 26 lettres minuscules
LETTERS # 26 lettres majuscules

Types de données

Données numériques

Par défaut les nombres sont considérés comme des variables numériques de type “floating point” (variables réelles), même si leur valeur particulière est entière.

# "double precision floating point numbers"
x <- 3
print(x)
## [1] 3
mode(x)
## [1] "numeric"
typeof(x)
## [1] "double"

On peut cependant explicitement déclarer une variable entière avec as.integer()

y <- as.integer(2)
print(y)
## [1] 2
mode(y)
## [1] "numeric"
typeof(y)
## [1] "integer"

Intérêt: les variables de type “Integer” utilisent moins d’espace mémoire que les “Floating point”.

Chaînes de charactères

Les variables de type “character” permettent de stocker des chaînes de caractères.

x <- "chaîne de caractères, toujours entre guillemets"
print(x)
## [1] "chaîne de caractères, toujours entre guillemets"
y <- 'ou avec des guillemets simples'
print(y)
## [1] "ou avec des guillemets simples"
mode(x)                  ## type de contenu de la variable x
## [1] "character"
nchar(x)                 ## lontgueur d'une chaîne de caractères
## [1] 47
paste(x, y, sep=" / ")   ## concaténation de variables de type character
## [1] "chaîne de caractères, toujours entre guillemets / ou avec des guillemets simples"

Variables Booléennes (logiques, binaires)

x <- TRUE # ou T ou FALSE ou F
print(x)
## [1] TRUE
mode(x)
## [1] "logical"
# sera utile pour tester des choses :
# if (condition) {
#   faire ça
# } else {
#   faire autre chose
# }

Structures de données

Vecteurs

Un vecteur permet de stocker dans une seule variable une liste d’élements du même type (numeric, character…).

Un vecteur peut contenir des valeurs de différents types: entiers, réells, Booléens, char, …

u <- c(2, 4, 5, 1)
print(u)
## [1] 2 4 5 1
v <- c(10, 5, 2, 2)
print(v)
## [1] 10  5  2  2
w <- c("Pierre", "Paul", "Jacques", "Henri")
print(w)
## [1] "Pierre"  "Paul"    "Jacques" "Henri"
l <- c(TRUE, FALSE, FALSE, TRUE)
print(l)
## [1]  TRUE FALSE FALSE  TRUE

Caractéristiques d’un vecteur

length(u)
## [1] 4
mode(u)
## [1] "numeric"
mode(w)
## [1] "character"
mode(l)
## [1] "logical"

Sélection/suppression d’éléments d’un vecteur

u[2]
## [1] 4
u[-2]
## [1] 2 5 1
u[c(1, 3)]
## [1] 2 5
u[l]
## [1] 2 1
u >= 3
## [1] FALSE  TRUE  TRUE FALSE
u[which(u >= 3)]
## [1] 4 5
v %in% c(2, 5)
## [1] FALSE  TRUE  TRUE  TRUE
v[which(v %in% c(2, 5))]
## [1] 5 2 2

Opérations sur des vecteurs

sort(u)
## [1] 1 2 4 5
summary(u)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    1.00    1.75    3.00    3.00    4.25    5.00
sum(u)
## [1] 12
mean(u)
## [1] 3
u + v
## [1] 12  9  7  3
u * v
## [1] 20 20 10  2
u / v
## [1] 0.2 0.8 2.5 0.5
cbind(u, v)
##      u  v
## [1,] 2 10
## [2,] 4  5
## [3,] 5  2
## [4,] 1  2
rbind(u, v)
##   [,1] [,2] [,3] [,4]
## u    2    4    5    1
## v   10    5    2    2

Création de séquences de nombres

1:10
##  [1]  1  2  3  4  5  6  7  8  9 10
seq(from=1, to=100, by=10)
##  [1]  1 11 21 31 41 51 61 71 81 91
seq(from=1, to=100, length=4)
## [1]   1  34  67 100
rep(x=c(1, 2), times=3)
## [1] 1 2 1 2 1 2
rep(x=c(1, 2), each=3)
## [1] 1 1 1 2 2 2

Valeurs non définies (NA)

u <- c(4, NA, 5, 2, NA, 3)
mean(u)
## [1] NA
mean(u, na.rm=TRUE)
## [1] 3.5

Facteurs

Les structures de données de type factor permettent de traiter des listes d’éléments dont les valeurs appartiennent à un ensemble défini. Ces valeurs sont indexées pour assurer une efficacité maximale du traitement informatique.

## Un vecteur
mentions <- c("Passable", "AB", "AB", "B", "TB", "TB", "Passable", "B", "Passable", "TB")
print(mentions)
##  [1] "Passable" "AB"       "AB"       "B"        "TB"       "TB"      
##  [7] "Passable" "B"        "Passable" "TB"
# vecteur avec des catégories
f <- factor(mentions)
print(f)    # Afficher le contenu du facteur
##  [1] Passable AB       AB       B        TB       TB       Passable
##  [8] B        Passable TB      
## Levels: AB B Passable TB
levels(f)   # Enumérer les catégories du facteur
## [1] "AB"       "B"        "Passable" "TB"
table(f)    # Dénombrer les éléments par catégorie
## f
##       AB        B Passable       TB 
##        2        2        3        3

Définir un ordre sur les niveaux d’un facteur

# notion d'ordre
f <- factor(mentions, levels=c("Passable", "AB", "B", "TB"))
print(f)    # Afficher le contenu du facteur
##  [1] Passable AB       AB       B        TB       TB       Passable
##  [8] B        Passable TB      
## Levels: Passable AB B TB
levels(f)   # Enumérer les catégories du facteur
## [1] "Passable" "AB"       "B"        "TB"
table(f)    # Dénombrer les éléments par catégorie
## f
## Passable       AB        B       TB 
##        3        2        2        3

Traitement des valeurs non-assignées (NA)

# NA et catégories non représentées
f <- factor(c("Passable", NA, "AB", "AB", NA, "B"), levels=c("Passable", "AB", "B", "TB"))
print(f)
## [1] Passable <NA>     AB       AB       <NA>     B       
## Levels: Passable AB B TB
levels(f)
## [1] "Passable" "AB"       "B"        "TB"
table(f)   # Où sont passées les valeurs NA ?
## f
## Passable       AB        B       TB 
##        1        2        1        0
## Imprimer les valeurs NA seulement si elles existent
table(f, useNA="ifany") 
## f
## Passable       AB        B       TB     <NA> 
##        1        2        1        0        2

Matrices

# tableau à N lignes et P colonnes avec des éléments du même type (numeric, character...)
m <- matrix(rnorm(30), nrow=6, ncol=5)
print(m)
##            [,1]        [,2]       [,3]        [,4]       [,5]
## [1,]  0.4961884 -0.02021720 -1.1746713 -1.19721072  1.1730014
## [2,]  0.7053770 -0.22150861  0.3411642 -0.56351229  0.8083728
## [3,] -0.5022711 -0.01906574 -0.6840956  0.12638131  0.6241060
## [4,] -0.0370270  0.41753686  0.4535602  0.79141006 -1.4852059
## [5,]  0.2178930  0.81342036 -0.3773423 -0.06359499  1.4941685
## [6,] -0.3649172 -0.09517266 -2.3805158  0.45423292 -1.4217601
n <- matrix(c("a","b","c","d","e","f"), ncol=3, byrow=TRUE)
print(n)
##      [,1] [,2] [,3]
## [1,] "a"  "b"  "c" 
## [2,] "d"  "e"  "f"

Caractéristiques d’une matrice

# caractéristiques d'une matrice
ncol(m)
## [1] 5
nrow(m)
## [1] 6
dim(m)
## [1] 6 5
length(m)
## [1] 30
mode(m)
## [1] "numeric"
mode(n)
## [1] "character"

Opérations sur des matrices

# opérations sur des matrices
mat1 <- matrix(1:6, nrow=2, ncol=3)
mat2 <- matrix(rnorm(6), nrow=2, ncol=3)
print(mat1)
##      [,1] [,2] [,3]
## [1,]    1    3    5
## [2,]    2    4    6
print(mat2)
##            [,1]      [,2]        [,3]
## [1,]  0.3411606 0.4112165 -0.06003983
## [2,] -1.2436369 1.8141770 -0.02260743

Elément par élément

# élément par élément
mat1 + mat2
##           [,1]     [,2]     [,3]
## [1,] 1.3411606 3.411216 4.939960
## [2,] 0.7563631 5.814177 5.977393
mat1 * mat2
##            [,1]     [,2]       [,3]
## [1,]  0.3411606 1.233649 -0.3001991
## [2,] -2.4872738 7.256708 -0.1356446

Produit matriciel (attention aux dimensions)

# produit matriciel (attention aux dimensions)
mat1 %*% t(mat2)
##          [,1]     [,2]
## [1,] 1.274611 4.085857
## [2,] 1.966948 4.633789
t(mat1) %*% mat2
##           [,1]      [,2]       [,3]
## [1,] -2.146113  4.039570 -0.1052547
## [2,] -3.951066  8.490357 -0.2705492
## [3,] -5.756018 12.941144 -0.4358437

Somme, moyenne, …

# somme, moyenne, ...
sum(mat1) # de tous les éléments
## [1] 21
rowSums(mat1) # des éléments de chaque ligne
## [1]  9 12
colSums(mat1) # des éléments de chaque colonne
## [1]  3  7 11
mean(mat1)
## [1] 3.5
rowMeans(mat1)
## [1] 3 4
colMeans(mat1)
## [1] 1.5 3.5 5.5

Sélection/suppression d’éléments d’une matrice

# sélection/suppression d'éléments d'une matrice
mat1[, c(2, 3)]
##      [,1] [,2]
## [1,]    3    5
## [2,]    4    6
mat1[1,]
## [1] 1 3 5
mat1[1, c(2, 3)]
## [1] 3 5

Structures de données de type liste

# permet de stocker des objets de types/longueurs différents
l1 <- list(n = c(TRUE, FALSE), 
           v = c(3, 4), 
           r = c("toto","plop", "tutu"), 
           mat1)
print(l1)
## $n
## [1]  TRUE FALSE
## 
## $v
## [1] 3 4
## 
## $r
## [1] "toto" "plop" "tutu"
## 
## [[4]]
##      [,1] [,2] [,3]
## [1,]    1    3    5
## [2,]    2    4    6
length(l1)
## [1] 4
names(l1)
## [1] "n" "v" "r" ""

Liste contenant une liste

# liste contenant une liste
l2 <- list(a="chaîne de caractères", l1=l1)
print(l2)
## $a
## [1] "chaîne de caractères"
## 
## $l1
## $l1$n
## [1]  TRUE FALSE
## 
## $l1$v
## [1] 3 4
## 
## $l1$r
## [1] "toto" "plop" "tutu"
## 
## $l1[[4]]
##      [,1] [,2] [,3]
## [1,]    1    3    5
## [2,]    2    4    6

Extraction d’éléments d’une liste

# extraction d'éléments d'une liste
l1$n
## [1]  TRUE FALSE
l2$l1
## $n
## [1]  TRUE FALSE
## 
## $v
## [1] 3 4
## 
## $r
## [1] "toto" "plop" "tutu"
## 
## [[4]]
##      [,1] [,2] [,3]
## [1,]    1    3    5
## [2,]    2    4    6
l2$l1$v
## [1] 3 4
l2[1]
## $a
## [1] "chaîne de caractères"
l2[[1]]
## [1] "chaîne de caractères"
is.list(l2[1])
## [1] TRUE
is.list(l2[[1]])
## [1] FALSE

Strctures de données de type data.frame

# tableau dont les colonnes ne sont pas nécessairement du même type (numeric, character...)
d <- data.frame(nom=c("Pierre", "Paul", "Henri", "Mathieu"), 
                taille=c(165, 168, 163, 170), 
                poids=c(58, 60, 62, 68))
print(d)
##       nom taille poids
## 1  Pierre    165    58
## 2    Paul    168    60
## 3   Henri    163    62
## 4 Mathieu    170    68
class(d)
## [1] "data.frame"
typeof(d) # une data.frame est un cas particulier d'une liste
## [1] "list"

Caractéristiques d’une data.frame

# caractéristiques d'une data.frame
ncol(d)
## [1] 3
nrow(d)
## [1] 4
names(d)
## [1] "nom"    "taille" "poids"
length(d)
## [1] 3

Sélection de colonnes

# sélection de colonnes
d$taille
## [1] 165 168 163 170
d[, "taille"]
## [1] 165 168 163 170
d[, c("nom", "taille")]
##       nom taille
## 1  Pierre    165
## 2    Paul    168
## 3   Henri    163
## 4 Mathieu    170

Sélection de lignes

# sélection de lignes
d[c(1, 3:4), ]
##       nom taille poids
## 1  Pierre    165    58
## 3   Henri    163    62
## 4 Mathieu    170    68
d$nom == "Pierre"
## [1]  TRUE FALSE FALSE FALSE
d[which(d$nom == "Pierre"),]
##      nom taille poids
## 1 Pierre    165    58

Résumé statistique

# résumé statistique
summary(d)
##       nom        taille          poids     
##  Henri  :1   Min.   :163.0   Min.   :58.0  
##  Mathieu:1   1st Qu.:164.5   1st Qu.:59.5  
##  Paul   :1   Median :166.5   Median :61.0  
##  Pierre :1   Mean   :166.5   Mean   :62.0  
##              3rd Qu.:168.5   3rd Qu.:63.5  
##              Max.   :170.0   Max.   :68.0

Fusion de deux data frames

# fusion de deux data frames
d2 <- data.frame(nom=c("Paul","Henri","Louis"), age=c(34, 29, 47))
print(d2)
##     nom age
## 1  Paul  34
## 2 Henri  29
## 3 Louis  47
merge(x=d, y=d2, by="nom")
##     nom taille poids age
## 1 Henri    163    62  29
## 2  Paul    168    60  34
merge(x=d, y=d2, by="nom", all=TRUE)
##       nom taille poids age
## 1   Henri    163    62  29
## 2 Mathieu    170    68  NA
## 3    Paul    168    60  34
## 4  Pierre    165    58  NA
## 5   Louis     NA    NA  47
merge(x=d, y=d2, by="nom", all.x=TRUE)
##       nom taille poids age
## 1   Henri    163    62  29
## 2 Mathieu    170    68  NA
## 3    Paul    168    60  34
## 4  Pierre    165    58  NA
merge(x=d, y=d2, by="nom", all.y=TRUE)
##     nom taille poids age
## 1 Henri    163    62  29
## 2  Paul    168    60  34
## 3 Louis     NA    NA  47

Création d’une nouvelle variable

# création d'une nouvelle variable
print(d)
##       nom taille poids
## 1  Pierre    165    58
## 2    Paul    168    60
## 3   Henri    163    62
## 4 Mathieu    170    68
d$age <- c(35, 42, 31, 28)
d$classe_poids <- ifelse(test=d$poids >= 60, yes=">=60", no="<60")
print(d)
##       nom taille poids age classe_poids
## 1  Pierre    165    58  35          <60
## 2    Paul    168    60  42         >=60
## 3   Henri    163    62  31         >=60
## 4 Mathieu    170    68  28         >=60

A l’aide

Aide dans R

help(read.table)
?read.table

Aide sur le web

Aide ici

  • les formateurs !

Espace de travail

Où suis-je ?

La commande R getwd() est équivalente de la commande Unix pwd vue hier.

# où suis-je ? équivalent de la commande Unix 'pwd'
getwd()
## [1] "/Users/jvanheld/Google Drive/EBAI_Roscoff/EBAI_2017-11/Cours/04_R"
R Unix
getwd() pwd

Où vais-je ?

La commande R setwd() est équivalente de la commande Unix cd vue hier.

# changement de répertoire courant: équivalent de la commande unix 'cd <path>'

# Chemin relativ
setwd("chemin/acces/au/nouveau/repertoire/")

# Chemin absolu
setwd("/home/hugo/chemin/acces/au/nouveau/repertoire/")
R Unix
setwd() cd

Lire et écrire des données

Quuelques manipulations de fichiers

R Unix
list.files() ls
file.copy() cp
# quelques manipulations de fichiers
f <- list.files(path="/projet/sbr/ggb/intro_R/", full.names=TRUE)
print(f)
## character(0)
file.copy(from=f, to=getwd())
## logical(0)

Vérifier ensuite que les fichiers ed données ont bien été copiés dans l’espace de travail.

list.files(path=getwd())
##  [1] "Icon\r"                                 
##  [2] "intro_R"                                
##  [3] "intro_R_Roscoff_debug.html"             
##  [4] "intro_R_Roscoff_debug.Rmd"              
##  [5] "intro_R_Roscoff.html"                   
##  [6] "intro_R_Roscoff.pdf"                    
##  [7] "intro_R_Roscoff.r"                      
##  [8] "intro_R_Roscoff.Rmd"                    
##  [9] "mon_environnement.RData"                
## [10] "objet_a.RData"                          
## [11] "prev"                                   
## [12] "rnaseq_data.csv"                        
## [13] "rnaseq_data.txt"                        
## [14] "rnaseq_export.txt"                      
## [15] "Saccharomyces_cerevisiae.R64-1-1.90.gtf"
## [16