depensesTI/Extraction.Rmd

145 lines
5.2 KiB
Text
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: "Extraction et préparation des données"
author: "François Pelletier"
date: "10 octobre 2015"
output: html_document
---
#Extraction et préparation des données du jeu «Tableau de bord de létat de santé des projets en ressources informationnelles de ladministration publique»
##Extraction des métadonnées
```{r}
library(XML)
library(dplyr)
source("FilterList.R")
# Identifiant unique du jeu de données
UUID = "c60b2248-0ca4-4b12-89d3-2f087a319bea"
# URL pour récupérer les métadonnées
urlRDF <- paste0("http://www.donnees.gouv.qc.ca/geonetwork/srv/eng/rdf.metadata.get?uuid=",UUID)
# Document de métadonnées
RDFdoc <- urlRDF %>%
xmlTreeParse %>%
xmlRoot
```
Quel est le contenu du fichier de métadonnées ?
```{r}
# Fréquence de chaque type de noeuds
RDFdoc %>%
names %>%
table %>%
as.data.frame %>%
"colnames<-"(c("Type de noeud","Fréquence"))
# Nombre de champs dans chaque noeud
xmlSApply(RDFdoc, xmlSize)
# Extraction à une profondeur de 1
champs <- xmlSApply(RDFdoc, function(x) xmlSApply(x, xmlValue))
# Je veux seulement les champs de type «Distribution»
champsDistribution <- champs[names(champs) == "Distribution"]
```
Je veux extraire les noms des fichiers de données pour les télécharger
```{r}
datafileNames <- champsDistribution %>%
lapply(function(x) as.character(x[x["format"] == "WWW:DOWNLOAD-1.0-ftp--downloadWWW:DOWNLOAD-1.0-ftp--download"])) %>%
FilterList(function(x) !identical(character(0),x)) %>%
as.data.frame %>% t
datafileNames
```
Les fichiers actuels présentent des erreurs d'encodage qui devront être corrigées manuellement. Voir le courriel joint.
```{r eval=FALSE}
rawdata <- list()
rawdata <- lapply(datafileNames[,1],read.csv2,header=FALSE,sep=";",encoding="utf-8",skip = 1)
```
Je télécharge donc les fichiers manuellement
```{r eval=FALSE}
lapply(datafileNames[,1], function (x) system2("wget", x))
noms_fichiers_telecharges <- list.files(path = ".", pattern = ".csv")
system("bash conversion_csv.sh")
```
Je les importe ensuite, puis je corrige toutes les incohérences pour faire la fusion
```{r}
rawdata <- list()
rawdata <- lapply(1:7,function(i) rawdata[[i]] <- read.csv2(paste0("tr_tableau_de_bord_",i,".csv"),
header = TRUE,
sep = ";",
encoding = "utf-8",
stringsAsFactors = FALSE,
dec = ","))
rawdata %>% lapply(names)
# Correction des tirets et conversion en numérique de la variable Pourcentage_avancement dans le 4e fichier
rawdata[[4]]$Pourcentage_avancement[levels(rawdata[[4]]$Pourcentage_avancement) == "-"] <- NA
rawdata[[4]]$Pourcentage_avancement <- as.integer(rawdata[[4]]$Pourcentage_avancement)
# Conversion en numérique pour compatibilité avec fusion de numériques au lieu d'entiers
for (i in 1:3)
{
rawdata[[i]]$Cote_de_coût <- as.numeric(rawdata[[i]]$Cote_de_coût)
rawdata[[i]]$Variation_de_coût <- as.numeric(rawdata[[i]]$Variation_de_coût)
rawdata[[i]]$Variation_écheancier <- as.numeric(rawdata[[i]]$Variation_écheancier)
}
for (i in 1:4)
{
rawdata[[i]]$Cote_écheancier <- as.numeric(rawdata[[i]]$Cote_écheancier)
}
rawdata[[5]]$Cote_echeancier <- as.numeric(rawdata[[5]]$Cote_echeancier)
rawdata[[5]]$Variation_de_cote_echeancier[levels(rawdata[[5]]$Variation_de_cote_echeancier) == "-"] <- NA
rawdata[[5]]$Variation_de_cote_echeancier <- as.numeric(rawdata[[5]]$Variation_de_cote_echeancier)
# Correction des montants pour 4 variables dans le 5e fichier
correction.montants.5 <- function(donnees)
{
donnees2 <- as.numeric(gsub(" ", "", gsub(",", ".", donnees)))
donnees2[105:450] <- donnees2[105:450]*1000
donnees2
}
rawdata[[5]]$Montant_reel_depense <- correction.montants.5(rawdata[[5]]$Montant_reel_depense)
rawdata[[5]]$Cout_estime_pour_completer_le_projet <- correction.montants.5(rawdata[[5]]$Cout_estime_pour_completer_le_projet)
rawdata[[5]]$Budget_autorise_revise <- correction.montants.5(rawdata[[5]]$Budget_autorise_revise)
rawdata[[5]]$Budget_autorise_initial <- correction.montants.5(rawdata[[5]]$Budget_autorise_initial)
# Conversion des noms de colonnes invalides
convertir.noms <- function(noms)
{
noms <- noms %>% iconv(to = "ASCII//TRANSLIT") %>% tolower
noms[noms == "date_de_fin_revise"] <- "date_de_fin_revisee"
noms[noms == "cote_de_cout"] <- "indicateur_de_cout"
noms[noms == "indicateur_du_cout"] <- "indicateur_de_cout"
noms[noms == "variation_cout"] <- "variation_de_cout"
noms[noms == "cote_echeancier"] <- "indicateur_de_l_echeancier"
noms[noms == "date_de_fin_prevue"] <- "date_de_fin_prevue_a_autorisation"
noms[noms == "budget_autorise"] <- "budget_autorise_initial"
noms[noms == "variation_de_cote_de_cout"] <- "variation_de_cout"
noms[noms == "variation_de_cote_echeancier"] <- "variation_echeancier"
noms
}
for (i in 1:7)
{
names(rawdata[[i]]) <- convertir.noms(names(rawdata[[i]]))
}
```
Jointure de tous les fichiers de données dans une même table
```{r}
rawdata2 <- dplyr::bind_rows(rawdata)
write.csv(rawdata2, "donnees_clean.csv",quote = TRUE,row.names = FALSE, na = "")
```