Blog ENI : Toute la veille numérique !
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici

Importer et exporter des données avec R

Introduction

Les données sont la matière première de l’ouvrage de statisticien, lorsque ce dernier travaille avec R, ce sont elles qu’il manipule, et il est très important de savoir comment connecter les différentes interfaces de données avec R. Dans les précédents chapitres, on a eu à utiliser des données saisies directement à la main, mais qu’en est-il exactement dans la réalité ? Dans la réalité, nos données sont stockées sur notre disque dur ou sur un support externe, ou encore téléchargeables en ligne, et ceci sous plusieurs formats (.csv, .txt, .xlsx, .json, etc.). Dans ce chapitre, on va aborder et apprendre comment accéder aux données à partir de diverses sources et comment les sauvegarder avec R.

Saisir/éditer les données depuis le clavier

R permet à l’utilisateur de saisir des données pendant la rédaction du script, mais également pendant l’exécution de ce dernier, notamment avec la fonction readline() qui a été utilisée dans le précédent chapitre sur la POO, qui permettait à l’utilisateur d’interagir avec le code en entrant interactivement les données. Mais elle n’est pas la seule fonction à permettre cela. Voici d’autres fonctions qui permettent d’entrer ou d’écrire des données directement dans des objets.

1. Les fonctions readline(), scan() et readClipboard()

a. La fonction readline()

Cette fonction permet de lire une ligne de données entrée depuis le clavier. Très pratique dans un programme interactif :

images/05EP01.png

Malheureusement, même si on saisit une valeur numérique, l’entrée est automatiquement lue dans l’objet comme une chaîne de caractères. Ainsi, il faut recourir à la fonction as.numeric() pour une coercition vers un type numérique. Par ailleurs, pour plus d’interactivité, l’argument prompt permet d’afficher une requête à l’utilisateur :

images/05EP02.png
images/05EP03.png

b. La fonction scan()

Cette fonction permet d’écrire plusieurs valeurs ou éléments homogènes au clavier sous forme notamment d’un vecteur. Ces éléments peuvent être séparés par un délimiteur spécifié par l’argument...

Accéder aux données depuis un fichier de données

Un data file est un fichier dont les caractéristiques permettent de structurer, stocker et restituer des données. Ce sont souvent des fichiers qui stockent des données se rapportant à une application spécifique, pour une utilisation ultérieure. On verra comment acquérir des données depuis différents types de fichiers de données avec R.

1. Fichier texte délimité

a. La fonction read.table()

Les données stockées dans un fichier texte peuvent être lues avec la fonction read.table(). Le plus souvent les données lues avec cette fonction sont structurées en colonnes délimitées par défaut par des espaces comme ci-dessous :

images/05EP25.png

Pour commencer, on s’assure d’avoir placé le dossier data (dossier livré avec l’acquisition de l’ouvrage) dans le répertoire de travail courant, autrement on devra fournir un chemin d’accès vers ce dossier. Par ailleurs, les données du fichier GOOGP.txt (visible ci-dessus) contiennent des en-têtes gérés avec l’argument header qui par défaut vaut FALSE :

images/05EP26.png

Comme on peut le voir ci-dessus, par défaut R a considéré les données de type character comme des facteurs.

Pour pallier ce problème, on utilise l’argument stringsAsFactors comme ci-dessous :

images/05EP27.png

Mais après cela, un problème persiste ! En effet, on peut lire également que les colonnes "Volume" (par défaut R ne reconnaît que les points comme séparateur décimal et considère les nombres avec séparateur de milliers comme des chaînes de caractères) et "Date" (on sait que les dates nécessitent un formatage spécial pour être reconnues comme telles !) sont considérées comme des chaînes de caractère alors qu’elles devraient être respectivement de type numeric et Date.

Avec ce que l’on a appris dans les chapitres précédents, on pourrait résoudre ce problème qui est en fait un cas de coercition et analyse syntaxique (parsage). Et ceci une fois les données stockées dans R avec diverses fonctions notamment as.Date() ou strptime() pour convertir la colonne...

Importer des données d’autres logiciels d’analyse de données

Parfois, il est question des données dont on dispose déjà et qui sont produites par d’autres logiciels d’analyse de données comme SPSS, Stata, MATLAB... Voici ci-dessous un tableau récapitulatif des différents packages qui permettent l’interopérabilité entre R et les données résultantes des autres logiciels :

images/05EP72.png

1. Logiciel IBM SPSS : *.sav

a. Le package foreign

La fonction read.spss() permet d’importer des données depuis un fichier *.sav en format liste. Parmi les arguments dont elle dispose, on trouve to.data.frame, qui permet de convertir les données en data frame et use.value.labels qui est l’équivalent de stringsAsFactor, et donc empêche la coercition automatique des variables chaînes de caractères en facteur.

images/05EP73.png

On observe qu’un problème se pose au niveau des dates. En effet, IBM SPSS encode les dates en nombre de secondes écoulées depuis le 14 octobre 1582, alors que R encode les dates en nombre de jours écoulés depuis le 1er janvier 1900. Il faut donc convertir les secondes en jours et définir le paramètre origin de la fonction as.Date(), à "1582-10-14" :

images/05EP74.png

b. Le package haven

Le package Haven propose une solution plus directe pour importer des données d’un fichier...

Télécharger des données depuis le Web

Parfois, les données sont stockées dans un fichier de données sur un site Internet ou carrément contenues dans un tableau d’une page web. On va voir maintenant comment importer ou télécharger des données grâce à une URL.

1. Télécharger un fichier de données grâce à l’URL

La plus grande part des fonctions qu’on a étudiées précédemment peut prendre en argument des URL pointant vers des fichiers *.txt, *.csv, etc. Notamment les fonctions read.table(), read.csv() et leurs autres fonctions dérivées. Voici ci-dessous l’illustration du téléchargement des données depuis un fichier *.csv ; étant donnée la longueur de l’URL (il est logé dans le fichier URL.txt du dossier data), il est courant dans la pratique de le découper et de concaténer chaque morceau du lien avec la fonction paste0() :

images/05EP81.png

2. Extraire les données d’un tableau HTML

Il est également possible d’importer des données du Web qui ne sont pas stockées dans un fichier de données mais contenues dans un tableau en HTML ou XML. On va continuer avec les données utilisées précédemment qui proviennent originellement du site Yahoo finance :

images/05EP82.png

Pour pouvoir extraire les données contenues dans le tableau ci-dessus, on va d’abord installer les packages : RCurl qui va permettre respectivement de connecter R à une URL et permettre le téléchargement de la page Web correspondante, et XML qui va permettre la traduction du HTML vers un objet R :

images/05EP83.png

Le package RCurl avec sa fonction getURL() (pour la gestion des liens) va permettre de télécharger le contenu HTML...

Accéder aux données depuis une base de données

Comme on peut le constater jusqu’ici, R ne tarit pas de packages pour extraire des données de sources diverses. Les bases de données étant les systèmes formels de structuration de données dans les organisations, il est évident que R les prend en compte.

1. Base de données MySQL

Pour ce qui est d’accéder aux données contenues dans une base de données, MySQL, R offre les packages RMySQL et RODBC notamment. On va considérer pour les besoins de l’application les données habituelles sur l’action Google stockées dans la base de données nommées stockdb comme on peut l’apercevoir dans la console MySQL.

images/05EP98.png

a. Le package RMySQL

Comme le montre l’image ci-dessus, on a bien les données enregistrées dans la base de données MySQL et le package RMySQL va permettre grâce au langage SQL (Structured Query Language) d’accéder aux données, et ceci avec des commandes R. Ainsi, il est important de connaître au minimum les requêtes de base, à savoir la sélection ou l’extraction d’une table, etc. C’est la fonction dbConnect() qui sert à établir la connexion entre R et la base de données. Elle prend notamment en argument les données d’accès utilisateurs, mais également le nom de la base de données :

images/05EP99.png

On trouve également la fonction dbListTables() qui permet de lire la liste des tables disponibles dans la base de données. Après, pour toutes les requêtes SQL, c’est la fonction dbGetQuery() qui se charge de transmettre la requête fournie en argument à la base de données, puis de récupèrer les résultats une fois la requête traitée :

images/05EP100.png
images/05EP101.png

Ce package ne permet pas que d’accéder aux données comme on peut le voir ci-dessous, mais également de les modifier, de créer des tables (pour autant que l’on ait les droits d’accès DBA (DataBase Administrator)... Bref, si on connaît le SQL, il sera dans son élément :

images/05EP102.png

La fonction pour créer une table est dbWriteTable(). Dans le code suivant, on ajoute une table qui contient les données des fleurs d’iris déjà...

Exporter des données

R permet également de produire ou exporter des données pour les sauvegarder dans un fichier de données particulier, notamment lorsqu’on a besoin de drainer des résultats vers d’autres applications ou simplement lorsqu’on veut juste visualiser ces dernières autrement qu’avec R. Lors des illustrations ou exemples qui vont suivre, les fichiers résultants seront enregistrés dans le dossier output :

images/05EP124.png

1. Fichier texte délimité

Pour produire ce type de fichier, on va utiliser la fonction write.table(), qui fait exactement l’inverse de ce qu’on a vu avec read.table(). L’argument principal de la fonction write.table(), sep, permet de définir le type de délimiteur ( tabulation "\t", virgule ",",point-virgule ";"…) que l’on voudrait utiliser pour encoder les données.

images/05EP125.png

On peut alors accéder aux fichiers produits et les données qu’ils contiennent ressemblent à l’image ci-dessous avec les lignes de data0.txt nommées numériquement (colonne encadrée en rouge) :

images/05EP126.png

2. Fichier CSV

On peut aussi bien utiliser la fonction write.table(), comme précédemment, ou les fonctions spécifiques write.csv() et write.csv2() qui sont les opposées des fonctions read.csv() et read.csv2() étudiées plus haut :

images/05EP127.png

Le fichier s’ouvre et affiche le contenu suivant, contenant les données manquantes :

images/05EP128.png

Que faire si le logiciel qui va utiliser les données de sorties ne reconnaît pas l’abréviation NA comme représentation de données manquantes ?

En fait, les fonctions write.table() ou wrtite.csv() disposent de l’argument na, qui permet de spécifier comment les NA ou valeurs manquantes seront représentées dans les données de sorties...