Skip to Content

R : comment importer les fichiers Microsoft Excel, traiter éventuellement les données (R-Spatial) et les exporter en fichiers Shapefiles

Niveau Intermédiaire
Logiciels utilisés R Project
RStudio
Plateforme Windows | Mac | Linux | FreeBSD

La plupart des spécialistes de R nous afffirment que les tableurs, dont Microsoft Excel, sont des outils, disons maladroits (pour ne pas dire plus...), pour traiter statistiquement les données (preuves à l'appui, voir www.cybaea.net/Blogs/Data/Spreadsheet-errors.html ou www-unix.oit.umass.edu/~evagold/excel.html parmi d'autres).

Fort bien, mais alors, que faire ? Utiliser R, répondent-t-ils, mais il faut alors commencer par importer ces fichiers dans R.

Après les avoir importés, nous verrons ensuite que la transformation d'un fichier Excel de points xy en un fichier shapefile peut être traitée avec 5 lignes de code.

Principes

R offre plusieurs packages pour lire et écrire des fichiers Microsoft Excel. Ils sont détaillés dans rwiki.sciviews.org/doku.php. Parmi ceux-ci :

  • il y en a qui sont liés à un OS (Windows, Mac OS X, Linux), d'autres non ;
  • il y en a qui nécessitent que Microsoft Excel soit installé, d'autres non ;
  • il y en a qui nécessitent que des programmes tiers soient installés, comme Java, Python ou Perl, d'autres non ;
  • et enfin, il y en a qui ne sont liés à rien, élaborés en pur R.

Notons que sur Windows, il est même possible d'utiliser R directement dans Excel avec RExcel ( answers.oreilly.com/topic/1009-how-to-use-r-inside-microsoft-excel/).

Lecture

Pour les lire, le plus simple est gdata (multi OS, sans nécessité qu'Excel ou un autre programme soit installé) avec la fonction read.xls (les formats xls et xslx sont supportés). Les feuilles d'un classeur sont spécifiées par leur numéro.

fichier Excel testxy.xls

importation fichier

  1. > library(gdata)
  2.  
  3. > # ouverture du fichier Excel et importation des données présentes sur la feuille 1
  4. > mes_données <- read.xls('testxy.xls',sheet=1)
  5.  
  6. > class(mes_données)
  7. [1] "data.frame"
  8. > str(mes_données)
  9. 'data.frame': 7 obs. of 4 variables:
  10. $ id : int 1 2 3 4 5 6 7
  11. $ x : int 235 245 255 265 275 285 295
  12. $ y : int 424 444 464 484 504 524 544
  13. $ test: Factor w/ 7 levels "a ","b ","c ",..: 1 2 3 4 5 6 7
  14. > # les données sont importées dans un dataframe
  15.  
  16. > mes_données
  17. id x y test
  18. 1 1 235 424 a
  19. 2 2 245 444 b
  20. 3 3 255 464 c
  21. 4 4 265 484 d
  22. 5 5 275 504 e
  23. 6 6 285 524 f
  24. 7 7 295 544 g
  25.  
  26. > summary(mes_données)
  27. id x y test
  28. Min. :1.0 Min. :235 Min. :424 a :1
  29. 1st Qu.:2.5 1st Qu.:250 1st Qu.:454 b :1
  30. Median :4.0 Median :265 Median :484 c :1
  31. Mean :4.0 Mean :265 Mean :484 d :1
  32. 3rd Qu.:5.5 3rd Qu.:280 3rd Qu.:514 e :1
  33. Max. :7.0 Max. :295 Max. :544 f :1
  34. g :1
  35. > mes_données$x
  36. [1] 235 245 255 265 275 285 295
  37. > mes_données$y
  38. [1] 424 444 464 484 504 524 544
  39. > mes_données$id
  40. [1] 1 2 3 4 5 6 7
  41.  
  42. > # plot basique des données x,y
  43. > plot(mes_données$x, mes_données$y)


Écriture

Le résultat de la lecture est donc un dataframe. Pour écrire un fichier Microsoft Excel, une des solutions est alors dataframes2xls qui nécessite que Python (> 2.4) soit installé. Comme son nom l'indique, il permet d'exporter un dataframe (ou plusieurs dataframes) dans une (ou plusieurs) feuille(s) d'un fichier Excel.

écriture

  1. > library(dataframes2xls)
  2.  
  3. > # écriture du fichier
  4. > dataframes2xls::write.xls(c(mes_données), "nouveau.xls")
  5.  

(voir aussi learnr.wordpress.com/2009/10/06/export-data-frames-to-multi-worksheet-excel-file/).

Pour aller plus loin : R-Spatial

Tout ça, c'est valable pour les statisticiens de tout poil, mais quel rapport avec les SIGs, penserez-vous ?

Transformation du dataframe en dataframe spatial

Il est très facile de transformer un tel dataframe avec des valeurs x,y en dataframe spatial grâce aux packages spatiaux. (cran.r-project.org/web/views/Spatial.html, voir  aussi « R - spatial : principes généraux et exemples de représentations cartographiques brutes (sans traitements (geo)statistiques) » sur le Portail). Utilisons le package spatial de base : sp (les autres packages spatiaux dépendent de lui) :

dataframe spatial

  1. > library(sp)
  2.  
  3. > # transformation du dataframe originel en un dataframe spatial
  4. > coordinates(mes_données) <- ~ x+y
  5.  
  6. > # résultat
  7. > class(mes_données)
  8. [1] "SpatialPointsDataFrame"
  9. attr(,"package")
  10. [1] "sp"
  11.  
  12. > str(mes_données)
  13. Formal class 'SpatialPointsDataFrame' [package "sp"] with 5 slots
  14. ..@ data :'data.frame': 7 obs. of 2 variables:
  15. .. ..$ id : int [1:7] 1 2 3 4 5 6 7
  16. .. ..$ test: Factor w/ 7 levels "a ","b ","c ",..: 1 2 3 4 5 6 7
  17. ..@ coords.nrs : int [1:2] 2 3
  18. ..@ coords : num [1:7, 1:2] 235 245 255 265 275 285 295 424 444 464 ...
  19. .. ..- attr(*, "dimnames")=List of 2
  20. .. .. ..$ : NULL
  21. .. .. ..$ : chr [1:2] "x" "y"
  22. ..@ bbox : num [1:2, 1:2] 235 424 295 544
  23. .. ..- attr(*, "dimnames")=List of 2
  24. .. .. ..$ : chr [1:2] "x" "y"
  25. .. .. ..$ : chr [1:2] "min" "max"
  26. ..@ proj4string:Formal class 'CRS' [package "sp"] with 1 slots
  27. .. .. ..@ projargs: chr NA

Le résultat est bien un SpatialPointsDataFrame (sans projection, qu'il est possible d'ajouter) qui peut  être soumis à tous les traitements spatiaux ou géostatistiques de R dont les principes ont déjà été illustrés en partie sur le Portail.

Exportation en shapefile

Après les traitements éventuels ou de manière brute, il est très facile d'exporter les données en shapefile ( www.nceas.ucsb.edu/scicomp/usecases/ReadWriteESRIShapeFiles, ou autre format spatial comme PostGIS)  :

Traitement avec le package maptools :

shapefile

  1. > library(maptools)
  2. > writeSpatialShape(mes_données, "données")

Shapefile résultant sur Quantum GIS :

 

Conclusions

En pratique il suffit donc de 5 lignes de code pour écrire la procédure complète de  transformation d'un fichier Excel en un  fichier shapefile (maptools dépend de sp qui est donc chargé)

Excel -> shapefile

  1. library(gdata)
  2. library (maptools)
  3. mes_données <- read.xls('testxy.xls',sheet=1)
  4. coordinates(mes_données) <- ~ x+y
  5. writeSpatialShape(mes_données, "données")

Cette procédure n'est évidemment valable que pour des données ponctuelles xy (et non des lignes ou des polygones). Pour les traitements éventuels, c'est un des domaines ou R excelle (« spatial point pattern »), sans nécessité d'extension payante... 

Les résultats des traitements peuvent évidemment être exportés en shapefiles lignes ou polygones (sans oublier les shapefiles 3D, les TIN, les rasters, les rasters 3D vers GRASS GIS, etc.).

Le rôle des tableurs pour stocker les données est aussi valorisé, en l'absence de base de données spatiales. Je traite de cette manière (traitements spatiaux et géostatistiques) des prélèvements géochimiques ponctuels avec environ 10000 échantillons et 20 variables.

Avec la solution en Python (« Python : lire et écrire des fichiers Microsoft Excel, application à Quantum GIS »), c'est donc une deuxième manière de traiter les fichiers Excel avec des solutions libres.

 

Tous les traitements ont été effectués sur Mac OS X, avec RStudio, merveilleux nouvel environnement de développement intégré pour R, multi OS. Le travail devient beaucoup plus convivial.

Site officiel : package gdata
Site officiel : RExcel
Site officiel : package maptools
Autres Liens : R - spatial : principes généraux et exemples de représentations cartographiques brutes (sans traitements (geo)statistiques)
Autres Liens : Python : lire et écrire des fichiers Microsoft Excel, application à Quantum GIS

Commentaires

je veux savoir comment

je veux savoir comment exporter par exemples j'ai plusieurs donneés danc le fichier exel juste moi je cherche a enlevés la colonne que j'ai besoin pas tous je cherche un script avec R pour ça car j'ai bcp de donnes danc ce fichier danc c'est pour ça que je veux exporter que les colonnes que je veux si c possible bien sur et merci pour votre aide

Poster un nouveau commentaire

Le contenu de ce champ sera maintenu privé et ne sera pas affiché publiquement.