Encore un tutoriel pour débuter en R

Mathieu Doray — Jan 17, 2013, 5:12 PM

#--------------------------------------------------------------
# Tutoriel pour débuter en R
# mathieu.doray@ifremer.fr, 16/1/2013
#--------------------------------------------------------------

# R est un langage de programmation libre orienté statistiques
# il est téléchargeable gratuitement sur le site : http://www.r-project.org/
# le logiciel (libre) RStudio facilite l'utilisation de R (cf. http://www.rstudio.com/)
#-------------------------------------

# 0. Bon à savoir : pour obtenir de l'aide sur une commande de R,
# taper help('le nom de la commande') ou ?le nom de la commande dans la console
#-------------------------------------

# 1. Les types d'objets de R
#-------------------------------------
# 1.1. le plus simple : le vecteur (1 dimension)
#-------------------------------------
# Ex. 1.1.1 : un vecteur numérique contenant 3 zéros
vecnum1=c(0,0,0)
vecnum1
[1] 0 0 0
# où "c" est une fonction prédéfinie qui permet de créer un vecteur
# une fonction est alimentée par des arguments, déclarés entre les parenthèses qui suivent sont nom. 
# une fonction produit en général des résultats qui sont stockés dans l'objet à gauche des signes "=" ou "<-",
# placés à gauche du nom de la fonction   

# vecnum1=c(0,0,0) est équivalent à :
vecnum1=rep(0,3)
vecnum1
[1] 0 0 0
# où rep est une fonction prédéfinie qui permet de dupliquer des objects 

# la fonction 'length' permet de connaitre la longueur d'un objet de dimension=1, comme un vecteur :
length(vecnum1)
[1] 3

# Ex. 1.1.2 : un vecteur numérique contenant la séquence 1,2,3
vecnum2=seq(3)
vecnum2
[1] 1 2 3
# seq est une fonction prédéfinie qui permet de générer des séquences de nombres

# Ex. 1.1.3 : opérations et sélection d'éléments des vecteurs numériques 
# on peut faire des opérations sur les vecteurs :
vecnum2+vecnum2
[1] 2 4 6
# ou sur des éléments des vecteurs :
vecnum2[2]*vecnum2[3]
[1] 6
# les crochets permettent de sélectionner les éléments des vecteurs

# Ex. 1.1.4 : un vecteur de caractères contenant les mots : 'je me sens comme' 'coupé en deux' 
vecchar=c('je me sens comme','coupé en deux' )
vecchar
[1] "je me sens comme" "coupé en deux"   
# on peut constituer une phrase dans un vecteur de taille 1 avec :
vecchar2=paste(vecchar[1],vecchar[2],'mais ça va mieux maintenant')
vecchar2
[1] "je me sens comme coupé en deux mais ça va mieux maintenant"
# les crochets permettent de sélectionner les éléments des vecteurs, la fonction 'paste' les concatène

# Ex. 1.1.5 : des vecteurs de type "facteur"
vecfac1 <- factor(substring("exemple", 1:7, 1:7))
vecfac1
[1] e x e m p l e
Levels: e l m p x
# la fonction "substring" permet d'extraire chacune des lettres du mot 'exemple'
vecfac2=factor(LETTERS[3:1], ordered = TRUE)
vecfac2
[1] C B A
Levels: A < B < C
# à comparer avec :
vecfac3=factor(LETTERS[3:1], ordered = FALSE)
vecfac3
[1] C B A
Levels: A B C
# voir ?factor pour plus de détails

# Ex. 1.1.6 : des vecteurs de type "booléens"
vecboo=vecfac1=='e'
vecboo
[1]  TRUE FALSE  TRUE FALSE FALSE FALSE  TRUE
# un booléen est créé avec les symboles relationnels d'égalité ("==") ou d'ingalité ("!=",">",etc...), cf. help('==')
vecboo2=vecnum2>1
vecboo2
[1] FALSE  TRUE  TRUE

# 1.2. en ajoutant une dimension, on obtient une matrice (2 dimensions, données homogènes)
#-------------------------------------
# Ex. 1.2.1 : une matrice de nombres
matnum1=matrix(rep(vecnum2,4),nrow=2)
matnum1
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    1    3    2    1    3    2
[2,]    2    1    3    2    1    3
# la fonction 'matrix' permet de créer une matrice de dimensions nrow et ncol (cf. help(matrix))
# la fonction 'dim' permet de connaitre les dimensions d'un objet de dimension>1
dim(matnum1)
[1] 2 6
# la fonction "dimnames" permet d'afficher ou de changer les noms de ligne et de colonne d'une matrice
dimnames(matnum1)
NULL
# la matrice matnum1 n'a pas encore de noms de colonnes ou lignes

# Ex. 1.2.2 : sélectionner des portions de la matrice :
# la première colonne :
matnum1[,1]
[1] 1 2
# la première ligne :
matnum1[1,]
[1] 1 3 2 1 3 2
# la cellule de la première ligne, première colonne :
matnum1[1,1]
[1] 1
# les éléments supérieurs à 2 :
matnum1[matnum1>2]
[1] 3 3 3 3
# ici la sélection se fait grâce à une matrice de booléens :
matnum1>2
      [,1]  [,2]  [,3]  [,4]  [,5]  [,6]
[1,] FALSE  TRUE FALSE FALSE  TRUE FALSE
[2,] FALSE FALSE  TRUE FALSE FALSE  TRUE

# Ex. 1.2.3 : les opérations sur les matrices de nombres sont simples et rapides dans R :
matnum1/5+2*matnum1
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]  2.2  6.6  4.4  2.2  6.6  4.4
[2,]  4.4  2.2  6.6  4.4  2.2  6.6

# Ex. 1.2.4 : une matrice de caractères
matchar=matrix(rep(vecchar,4),ncol=2)
matchar
     [,1]               [,2]              
[1,] "je me sens comme" "je me sens comme"
[2,] "coupé en deux"    "coupé en deux"   
[3,] "je me sens comme" "je me sens comme"
[4,] "coupé en deux"    "coupé en deux"   
dim(matchar)
[1] 4 2

# Ex. 1.2.5 : tous les éléments d'une matrice doivent être du même type
cbind(matnum1,t(matchar))
     [,1] [,2] [,3] [,4] [,5] [,6] [,7]               [,8]           
[1,] "1"  "3"  "2"  "1"  "3"  "2"  "je me sens comme" "coupé en deux"
[2,] "2"  "1"  "3"  "2"  "1"  "3"  "je me sens comme" "coupé en deux"
     [,9]               [,10]          
[1,] "je me sens comme" "coupé en deux"
[2,] "je me sens comme" "coupé en deux"
# Ici, R a collé verticalement les 2 matrices avec la fonction 'cbind', 
# mais a converti tous les éléments en caractères dans l'opération pour conserver leur homogénéité
# la fonction "t" a permis de transposer la matrice vecchar pour qu'elle ait le même nombre de lignes que "matnum1"

# Ex. 1.2.6 : une matrice peut avoir des noms de lignes et de colonnes
# et R permet de faire beaucoup de choses en peu de lignes :
dimnames(matnum1)=list(paste('ligne',seq(dim(matnum1)[1])),paste('col',seq(dim(matnum1)[2])))
matnum1
        col 1 col 2 col 3 col 4 col 5 col 6
ligne 1     1     3     2     1     3     2
ligne 2     2     1     3     2     1     3

# 1.3. le dataframe : un tableau à 2 dimensions, avec des données de différents types
#-------------------------------------
# Ex. 1.3.1 : un dataframe avec une matrice numérique et une matrice de caractères
df=data.frame(matnum1,t(matchar))
df
        col.1 col.2 col.3 col.4 col.5 col.6               X1            X2
ligne 1     1     3     2     1     3     2 je me sens comme coupé en deux
ligne 2     2     1     3     2     1     3 je me sens comme coupé en deux
                      X3            X4
ligne 1 je me sens comme coupé en deux
ligne 2 je me sens comme coupé en deux
# la fonction 'data.frame' permet de créer un dataframe en collant des objets aux dimensions compatibles (cf. help(data.frame))
dim(df)
[1]  2 10
# la fonction "names" permet d'afficher ou de changer les noms des colonnes d'un dataframe
names(df)
 [1] "col.1" "col.2" "col.3" "col.4" "col.5" "col.6" "X1"    "X2"   
 [9] "X3"    "X4"   
names(df)=paste('col',seq(dim(df)[2]),sep='')
names(df)
 [1] "col1"  "col2"  "col3"  "col4"  "col5"  "col6"  "col7"  "col8" 
 [9] "col9"  "col10"
# la fonction "row.names" permet d'afficher ou de changer les noms des ligne d'un dataframe
rownames(df)
[1] "ligne 1" "ligne 2"
rownames(df)=paste('ligne',seq(dim(df)[1]))
rownames(df)
[1] "ligne 1" "ligne 2"
df
        col1 col2 col3 col4 col5 col6             col7          col8
ligne 1    1    3    2    1    3    2 je me sens comme coupé en deux
ligne 2    2    1    3    2    1    3 je me sens comme coupé en deux
                    col9         col10
ligne 1 je me sens comme coupé en deux
ligne 2 je me sens comme coupé en deux

# Ex. 1.3.2 : sélectionner des portions du dataframe :
# la première colonne :
df[,1]       # ou :
[1] 1 2
df[,'col1'] # ou encore :
[1] 1 2
df$col1
[1] 1 2
# la première ligne :
df[1,]        # ou :
        col1 col2 col3 col4 col5 col6             col7          col8
ligne 1    1    3    2    1    3    2 je me sens comme coupé en deux
                    col9         col10
ligne 1 je me sens comme coupé en deux
df['ligne 1',]
        col1 col2 col3 col4 col5 col6             col7          col8
ligne 1    1    3    2    1    3    2 je me sens comme coupé en deux
                    col9         col10
ligne 1 je me sens comme coupé en deux
# la cellule de la première ligne, première colonne :
df[1,1]
[1] 1
# les colonnes 3 et 4 :
df[,c(3,4)]   #ou :
        col3 col4
ligne 1    2    1
ligne 2    3    2
df[,c('col3','col4')]
        col3 col4
ligne 1    2    1
ligne 2    3    2

# Ex. 1.3.3 : ajouter une colonne "newcol" contenant des 1 au dataframe :
df$newcol=1
df
        col1 col2 col3 col4 col5 col6             col7          col8
ligne 1    1    3    2    1    3    2 je me sens comme coupé en deux
ligne 2    2    1    3    2    1    3 je me sens comme coupé en deux
                    col9         col10 newcol
ligne 1 je me sens comme coupé en deux      1
ligne 2 je me sens comme coupé en deux      1

# Ex. 1.3.4 : Opérations utiles sur les dataframes : aggregate
# ou comment appliquer une fonction 'FUN' à des colonnes, en fonction d'une variable de regroupement
df2=data.frame(x=seq(10),g=c(rep(1,5),rep(2,5)))
dfa=aggregate(df2$x,by=list(df2$g),FUN=sum)
df2;dfa
  Group.1  x
1       1 15
2       2 40

# Ex. 1.3.5 : Opérations utiles sur les dataframes : merge
# ou comment joindre 2 dataframes selon une (ou des) colonne(s) communes

authors <- data.frame(surname = I(c("Tukey", "Venables", "Tierney", "Ripley", "McNeil")),
  nationality = c("US", "Australia", "US", "UK", "Australia"),deceased = c("yes", rep("no", 4)))
books <- data.frame(name = I(c("Tukey", "Venables", "Tierney","Ripley", "Ripley", "McNeil", "R Core")),
  title = c("Exploratory Data Analysis","Modern Applied Statistics ...","LISP-STAT","Spatial Statistics",
            "Stochastic Simulation","Interactive Data Analysis","An Introduction to R"),
  other.author = c(NA, "Ripley", NA, NA, NA, NA,
                   "Venables & Smith"))

(m1 <- merge(authors, books, by.x = "surname", by.y = "name"))
   surname nationality deceased                         title other.author
1   McNeil   Australia       no     Interactive Data Analysis         <NA>
2   Ripley          UK       no            Spatial Statistics         <NA>
3   Ripley          UK       no         Stochastic Simulation         <NA>
4  Tierney          US       no                     LISP-STAT         <NA>
5    Tukey          US      yes     Exploratory Data Analysis         <NA>
6 Venables   Australia       no Modern Applied Statistics ...       Ripley
(m2 <- merge(books, authors, by.x = "name", by.y = "surname"))
      name                         title other.author nationality deceased
1   McNeil     Interactive Data Analysis         <NA>   Australia       no
2   Ripley            Spatial Statistics         <NA>          UK       no
3   Ripley         Stochastic Simulation         <NA>          UK       no
4  Tierney                     LISP-STAT         <NA>          US       no
5    Tukey     Exploratory Data Analysis         <NA>          US      yes
6 Venables Modern Applied Statistics ...       Ripley   Australia       no