Search
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
SegmentVitesseMPuissanceEstim
Km1 31.9130
Km2 33.3165
Km3 28.1130
Km4 30.8133
Km5 27.7103
Km6 31.2154

Ou directement à partir du web:

test_csv <-read.csv("https://raw.githubusercontent.com/nmeraihi/data/master/exemple_1.csv")
test_csv
SegmentVitesseMPuissanceEstim
Km1 31.9130
Km2 33.3165
Km3 28.1130
Km4 30.8133
Km5 27.7103
Km6 31.2154

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
  1. 'Segment'
  2. 'VitesseM'
  3. 'PuissanceEstim'
$class
'data.frame'
$row.names
  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 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
V1V2V3
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
SegmentVitesseMPuissanceEstim
Km1 31.9130
Km2 33.3165
Km3 28.1130
Km4 30.8133
Km5 27.7103
Km6 31.2154

Regardons la classe de la variable "Segment";

class(exemple$Segment)
'factor'

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
SegmentVitesseMPuissanceEstim
Km1 31.9130
Km2 33.3165
Km3 28.1130
Km4 30.8133
Km5 27.7103
Km6 31.2154

Maintenant, regardons la classe de la variable "Segment"

class(exemple$Segment)
'character'

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
VitesseMPuissanceEstim
31.9130
33.3165
28.1130
30.8133
27.7103
31.2154
exemple <-read.csv("exemple_1.csv", header = T, stringsAsFactors=F)[,c(1,3)]
exemple
SegmentPuissanceEstim
Km1130
Km2165
Km3130
Km4133
Km5103
Km6154

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 = ",")
SegmentVitesseMPuissanceEstim
Km1 31.9130
Km2 33.3165
Km3 28.1130
Km4 30.8133
Km5 27.7103
Km6 31.2154

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_namemonthmonthly_increasemonthly_begin_atmonthly_end_with
Bukkit 2012-03 9 431 440
Bukkit 2012-0419 438 457
Bukkit 2012-0519 455 474
Bukkit 2012-0618 475 493
Bukkit 2012-0715 492 507
Bukkit 2012-0850 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 = ",")
kmtempsvitesseMoyennepuissanceMoyennebpm
1.244:01 19.1 160 134
NA9:42 30.2 133 146
1.021:57 30.8 141 139
17.6136:1129.2 NA 144
9.2719:1029.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)
kmtempsvitesseMoyennepuissanceMoyennebpm
FALSEFALSEFALSEFALSEFALSE
TRUEFALSEFALSEFALSEFALSE
FALSEFALSEFALSEFALSEFALSE
FALSEFALSEFALSE TRUEFALSE
FALSEFALSEFALSEFALSEFALSE

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])
FALSE
is.na(df[2,1])
TRUE

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))
7.285

Le calcul de la moyenne a été fait sur les variables;

na.omit(df$km)
  1. 1.24
  2. 1.02
  3. 17.61
  4. 9.27

La fonction mean possède un argument optionnel appelé na.rm = qui ignore les valeurs manquantes;

mean(df$km,na.rm = T)
7.285

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)
kmtempsvitesseMoyennepuissanceMoyennebpm
11.24 4:01 19.1 160 134
31.02 1:57 30.8 141 139
59.27 19:1029.0 121 143

On peut aller modifier directement la valeur de cet élément

df[2,1]<-4.84
 df[4,4]<-125
df
kmtempsvitesseMoyennepuissanceMoyennebpm
1.244:01 19.1 160 134
4.849:42 30.2 133 146
1.021:57 30.8 141 139
17.6136:1129.2 125 144
9.2719:1029.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
kmtempsvitesseMoyennepuissanceMoyennebpm
1.244:01 19.1 160 134
NA9:42 30.2 133 146
1.021:57 30.8 141 139
17.6136:1129.2 NA 144
9.2719:1029.0 121 143

Nous remplaçons alors les NA par 0 ou par toute autre valeur comme suit;

df[is.na(df)] <- 0
df
kmtempsvitesseMoyennepuissanceMoyennebpm
1.244:01 19.1 160 134
0.009:42 30.2 133 146
1.021:57 30.8 141 139
17.6136:1129.2 0 144
9.2719:1029.0 121 143