Importation des données#
Nous avons vu dans le dernier cours les data frames, nous l’avions créée manuellement. Toutefois, nous allons souvent importer des données en pratique sous plusieurs formats. Ces fichiers que nous allons importer seront souvent dans des fichiers .csv
(Comma-separated values). Ces fichiers sont très populaires et ils sont générés par Excel .
read.csv#
options(repr.matrix.max.cols=8, repr.matrix.max.rows=8) #seulement pour afficher 8 lignes et 8 colonnes
On peut lire les fichiers .csv
localement en précisant le chemin exacte menant vers du fichier en question.
# test_csv <-read.csv("https://raw.githubusercontent.com/nmeraihi/data/master/exemple_1.csv")
test_csv <-read.csv("exemple_1.csv")
test_csv
Warning message in file(file, "rt"):
“cannot open file 'exemple_1.csv': No such file or directory”
Error in file(file, "rt"): cannot open the connection
Traceback:
1. read.csv("exemple_1.csv")
2. read.table(file = file, header = header, sep = sep, quote = quote,
. dec = dec, fill = fill, comment.char = comment.char, ...)
3. file(file, "rt")
Ou directement à partir du web:
test_csv <-read.csv("https://raw.githubusercontent.com/nmeraihi/data/master/exemple_1.csv")
test_csv
Segment | VitesseM | PuissanceEstim |
---|---|---|
Km1 | 31.9 | 130 |
Km2 | 33.3 | 165 |
Km3 | 28.1 | 130 |
Km4 | 30.8 | 133 |
Km5 | 27.7 | 103 |
Km6 | 31.2 | 154 |
Lorsque nous écrivons read.csv
, R traite importe ce fichier sous format data frame
, il nous retourne les noms de colonnes, les lignes ainsi que la classe du df
attributes(test_csv)
- $names
- 'Segment'
- 'VitesseM'
- 'PuissanceEstim'
- $class
- 'data.frame'
- $row.names
- 1
- 2
- 3
- 4
- 5
- 6
Dans la méthode read.csv
, il existe un argument optionnel _header_
qui est par défaut header=T
. Cet argument spécifie si les données que nous voulons importer possèdent des noms de colonne (header=TRUE
~ header=T
.) ou pas (header=FALSE
~ header=F
.). Regardons ce que ça donnerait si nous changeons la valeur header=F
;
test_csv <-read.csv("exemple_1.csv", header = F)
test_csv
V1 | V2 | V3 |
---|---|---|
Segment | VitesseM | PuissanceEstim |
Km1 | 31.9 | 130 |
Km2 | 33.3 | 165 |
Km3 | 28.1 | 130 |
Km4 | 30.8 | 133 |
Km5 | 27.7 | 103 |
Km6 | 31.2 | 154 |
On remarque que R crée des noms de colonnes appelés V1, V2...etc.
exemple <-read.csv("exemple_1.csv", header = T)
exemple
Segment | VitesseM | PuissanceEstim |
---|---|---|
Km1 | 31.9 | 130 |
Km2 | 33.3 | 165 |
Km3 | 28.1 | 130 |
Km4 | 30.8 | 133 |
Km5 | 27.7 | 103 |
Km6 | 31.2 | 154 |
Regardons la classe de la variable « Segment »;
class(exemple$Segment)
Surprise!. En effet, il existe une autre option dans la méthode read.csv
qui permet de traiter les catégories en type caractère.
exemple <-read.csv("exemple_1.csv", header = T, stringsAsFactors=F)
exemple
Segment | VitesseM | PuissanceEstim |
---|---|---|
Km1 | 31.9 | 130 |
Km2 | 33.3 | 165 |
Km3 | 28.1 | 130 |
Km4 | 30.8 | 133 |
Km5 | 27.7 | 103 |
Km6 | 31.2 | 154 |
Maintenant, regardons la classe de la variable « Segment »
class(exemple$Segment)
Une partie seulement du df#
Il est possible de lire seulement certaines colonnes du fichier csv qu’on veut importer;
exemple <-read.csv("exemple_1.csv", header = T, stringsAsFactors=F)[,2:3]
exemple
VitesseM | PuissanceEstim |
---|---|
31.9 | 130 |
33.3 | 165 |
28.1 | 130 |
30.8 | 133 |
27.7 | 103 |
31.2 | 154 |
exemple <-read.csv("exemple_1.csv", header = T, stringsAsFactors=F)[,c(1,3)]
exemple
Segment | PuissanceEstim |
---|---|
Km1 | 130 |
Km2 | 165 |
Km3 | 130 |
Km4 | 133 |
Km5 | 103 |
Km6 | 154 |
read.table#
Une autre façon d’importer des données à l’intérieur des df est d’utiliser la méthode read.table
qui traite les fichiers text
;
read.table("exemple_1.txt", header=T)
Segment.VitesseM.PuissanceEstim |
---|
Km1,31.9,130 |
Km2,33.3,165 |
Km3,28.1,130 |
Km4,30.8,133 |
Km5,27.7,103 |
Km6,31.2,154 |
On voit bien que les colonnes n’ont pas été séparées comme il faut. Nous devons spécifier les caractères qui séparent ces variables.
read.table("exemple_1.txt", header=T, sep = ",")
Segment | VitesseM | PuissanceEstim |
---|---|---|
Km1 | 31.9 | 130 |
Km2 | 33.3 | 165 |
Km3 | 28.1 | 130 |
Km4 | 30.8 | 133 |
Km5 | 27.7 | 103 |
Km6 | 31.2 | 154 |
En utilisant le package RCurl
#
Il est possible d’utiliser la bibliothèque RCurl
qui offre plus d’options. Dans ce cours, nous nous limitons à l’utilisation de read.csv
. Pour plus d’informations sur cette bibliothèque, vous pouvez lire plus de détails la documentation de ce package.
install.packages("RCurl")
Updating HTML index of packages in '.Library'
Making 'packages.html' ... done
library(RCurl)
Loading required package: bitops
x <- getURL("https://raw.githubusercontent.com/aronlindberg/latent_growth_classes/master/LGC_data.csv")
y <- read.csv(text = x)
head(y)
top100_repository_name | month | monthly_increase | monthly_begin_at | monthly_end_with |
---|---|---|---|---|
Bukkit | 2012-03 | 9 | 431 | 440 |
Bukkit | 2012-04 | 19 | 438 | 457 |
Bukkit | 2012-05 | 19 | 455 | 474 |
Bukkit | 2012-06 | 18 | 475 | 493 |
Bukkit | 2012-07 | 15 | 492 | 507 |
Bukkit | 2012-08 | 50 | 506 | 556 |
Traiter les valeurs manquantes#
Afin d’illustrer le traitement des valeurs manquantes dans R, importons les données de l’exemple 2_2
read.table("https://raw.githubusercontent.com/nmeraihi/data/master/exemple_2_2.txt", header=T, sep = ",")
km | temps | vitesseMoyenne | puissanceMoyenne | bpm |
---|---|---|---|---|
1.24 | 4:01 | 19.1 | 160 | 134 |
NA | 9:42 | 30.2 | 133 | 146 |
1.02 | 1:57 | 30.8 | 141 | 139 |
17.61 | 36:11 | 29.2 | NA | 144 |
9.27 | 19:10 | 29.0 | 121 | 143 |
On peut appliquer un test booléen afin de vérifier l’existance des valeurs manquantes comme suit;
df<-read.table("https://raw.githubusercontent.com/nmeraihi/data/master/exemple_2_2.txt", header=T, sep = ",")
is.na(df)
km | temps | vitesseMoyenne | puissanceMoyenne | bpm |
---|---|---|---|---|
FALSE | FALSE | FALSE | FALSE | FALSE |
TRUE | FALSE | FALSE | FALSE | FALSE |
FALSE | FALSE | FALSE | FALSE | FALSE |
FALSE | FALSE | FALSE | TRUE | FALSE |
FALSE | FALSE | FALSE | FALSE | FALSE |
Cette fonction nous retourne un data frame du même format que le df test. Le résultat obtrenu sont valeurs TRUE
sur les éléments manquants, et des FALSE
sur les valeurs existantes.
On peut faire le test sur une partie précise du df;
is.na(df[1,1])
is.na(df[2,1])
Mais pourquoi préocupe t-on tant des valeurs manquantes? Eh bien, les valeurs manquantes sont le cauchemar #1 de toute personne qui manipule les données, que ce soit en entreprise ou pour un utilisation personnelle.
Essayons de faire un calcul de la moyenne du nombre de km;
mean(df$km)
[1] NA
R
nous retourne NA
même si nous avons une seule observation qui est manquante
On peut régler ce problème avec la fonction na.omit()
mean(na.omit(df$km))
Le calcul de la moyenne a été fait sur les variables;
na.omit(df$km)
- 1.24
- 1.02
- 17.61
- 9.27
La fonction mean
possède un argument optionnel appelé na.rm =
qui ignore les valeurs manquantes;
mean(df$km,na.rm = T)
Lorsque nous utilisons la fonction ns.omit
, le df se réduit à un df qui ne possède aucune ligne contenant les valeurs manquantes;
na.omit(df)
km | temps | vitesseMoyenne | puissanceMoyenne | bpm | |
---|---|---|---|---|---|
1 | 1.24 | 4:01 | 19.1 | 160 | 134 |
3 | 1.02 | 1:57 | 30.8 | 141 | 139 |
5 | 9.27 | 19:10 | 29.0 | 121 | 143 |
On peut aller modifier directement la valeur de cet élément
df[2,1]<-4.84
df[4,4]<-125
df
km | temps | vitesseMoyenne | puissanceMoyenne | bpm |
---|---|---|---|---|
1.24 | 4:01 | 19.1 | 160 | 134 |
4.84 | 9:42 | 30.2 | 133 | 146 |
1.02 | 1:57 | 30.8 | 141 | 139 |
17.61 | 36:11 | 29.2 | 125 | 144 |
9.27 | 19:10 | 29.0 | 121 | 143 |
Remplacer toutes les valeurs manquantes:#
Des fois, il peut être utile de remplacer toutes les valeurs manquantes par des 0. Je dis bien des fois, car les valeurs manquantes sont absentes et non des 0.
df<-read.table("https://raw.githubusercontent.com/nmeraihi/data/master/exemple_2_2.txt", header=T, sep = ",")
df
km | temps | vitesseMoyenne | puissanceMoyenne | bpm |
---|---|---|---|---|
1.24 | 4:01 | 19.1 | 160 | 134 |
NA | 9:42 | 30.2 | 133 | 146 |
1.02 | 1:57 | 30.8 | 141 | 139 |
17.61 | 36:11 | 29.2 | NA | 144 |
9.27 | 19:10 | 29.0 | 121 | 143 |
Nous remplaçons alors les NA
par 0
ou par toute autre valeur comme suit;
df[is.na(df)] <- 0
df
km | temps | vitesseMoyenne | puissanceMoyenne | bpm |
---|---|---|---|---|
1.24 | 4:01 | 19.1 | 160 | 134 |
0.00 | 9:42 | 30.2 | 133 | 146 |
1.02 | 1:57 | 30.8 | 141 | 139 |
17.61 | 36:11 | 29.2 | 0 | 144 |
9.27 | 19:10 | 29.0 | 121 | 143 |