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