Convertit les données contenues dans les proc format
d'un programme SAS en
une liste de vecteurs qui pourra servir à effectuer des conversions.
from_pgm(sas_pgm, quote = c("double", "simple"), source = FALSE)
sas_pgm | un programme SAS sous la forme d'un vecteur de chaînes de caractères. |
---|---|
quote | type de guillemet. SAS autorise deux types de guillemets pour
décrire une chaîne de caractères. La fonction suppose que des guillemets
doubles sont utilisés ("). Dans le cas contraire ('), spécifier
|
source | conserver le code SAS dans un attribut |
Une liste contenant autant d'éléments que de formats si les données
avaient été générées par SAS via une proc format
.
les noms de la liste correspondent aux noms des formats (value $...
) ;
les éléments de la liste sont des vecteurs contenant les relations entre valeurs initiales et valeurs converties ;
chaque élément a un éventuel attribut "other"
;
chaque élément est un objet de type fmtsas_c
, ce qui permet
d'utiliser l'opérateur de sélection avec prise en
compte d'une valeur par défaut (other
).
Voir les exemples pour l'utilisation de cette liste.
La fonction ne recherche que les formats de type caractère (value $nom
).
Les formats numériques sont ignorés (un message d'avertissement dresse une
liste de ces formats, s'ils sont présents).
Le programme peut se présenter sous la forme d'une chaîne unique de
caractères mais aussi d'un vecteur de plusieurs chaînes (typiquement le
résultat de la lecture d'un fichier par readLines). Les commentaires,
espaces et sauts de lignes surnuméraires sont autorisés. La casse du code SAS
(majuscule ou minuscule) est sans importance. Le programme peut en outre
contenir autre chose que des proc format
.
La fonction détecte plusieurs valeurs séparées par des virgules à gauche du
signe =
. En revanche, les intervalles de caractères (type "A"-"Z"
) ne
sont pas gérés car ils contiennent un nombre indéfini de modalités possibles.
Les bornes de l'intervalle seront toutefois prises en compte (comme si
"A","Z"
était écrit). La syntaxe sans les guillemets (A-Z
), également
permise par SAS, n'est pas prise en compte et ces intervalles seront
ignorés.
Il est possible de choisir le type de guillemets (double ou simple) entourant les valeurs. Avec un programme contenant un mélange de guillemets simples et doubles, la fonction ne détectera qu'un type et pas l'autre.
La modalité SAS other
(valeur par défaut) est sauvegardée dans l'attribut
"other" pour chaque élément de la liste. Si le format SAS n'a pas de valeur
par défaut, l'attribut n'est pas présent.
from_tab pour importer les formats contenus dans une table SAS.
## Import d'un programme SAS : test_pgm <- readLines( system.file("extdata/pgm_format_test.sas", package = "fmtsas"), encoding = "UTF-8" ) cat(test_pgm, sep = "\n") #> proc format ; #> #> /* Noms régions */ #> value $reg #> "01" = "Guadeloupe" #> "02" = "Martinique" #> "03" = "Guyane" #> "04" = "La Réunion" #> "06" = "Mayotte" #> "11" = "Île-de-France" #> "24" = "Centre-Val de Loire" #> "27" = "Bourgogne-Franche-Comté" #> "28" = "Normandie" #> "32" = "Hauts-de-France" #> "44" = "Grand Est" #> "52" = "Pays de la Loire" #> "53" = "Bretagne" #> "75" = "Nouvelle Aquitaine" #> "76" = "Occitanie" #> "84" = "Auvergne-Rhône-Alpes" #> "93" = "Provence-Alpes-Côte d'Azur" #> "94" = "Corse" ; #> #> /* Secteur d'activité regroupé */ #> value $a13_ #> "B", "C", "D", "E" = "Industrie" #> "F" = "Construction" #> "G" = "Commerce, réparation d'automobiles et de motocycles" #> "H" = "Transports et entreposage" #> "I" = "Hébergement et restauration" #> "J" = "Information et communication" #> "K", "L" = "Activités financières, d'assurance et immobilières" #> "M" = "Activités spécialisées, scientifiques et techniques" #> "N" = "Activités de services administratifs et de soutien" #> "P" = "Enseignement" #> "Q" = "Santé humaine et action sociale" #> other = "Hors champ" ; #> #> run ; #> #> PROC FORMAT;VALUE $ sexe "1"="Homme" "2"="Femme" ;RUN; #> #> data t1 ; #> set t2 ; #> GEO2 = put(REG2016, $reg.) ; #> A13 = put(A21, $a13_.) ; #> run ; ## Conversion des formats : conv <- from_pgm(test_pgm) conv #> $reg #> # a character `fmtsas` object #> 01 02 #> "Guadeloupe" "Martinique" #> 03 04 #> "Guyane" "La Réunion" #> 06 11 #> "Mayotte" "Île-de-France" #> 24 27 #> "Centre-Val de Loire" "Bourgogne-Franche-Comté" #> 28 32 #> "Normandie" "Hauts-de-France" #> 44 52 #> "Grand Est" "Pays de la Loire" #> 53 75 #> "Bretagne" "Nouvelle Aquitaine" #> 76 84 #> "Occitanie" "Auvergne-Rhône-Alpes" #> 93 94 #> "Provence-Alpes-Côte d'Azur" "Corse" #> #> $a13_ #> # a character `fmtsas` object #> B #> "Industrie" #> C #> "Industrie" #> D #> "Industrie" #> E #> "Industrie" #> F #> "Construction" #> G #> "Commerce, réparation d'automobiles et de motocycles" #> H #> "Transports et entreposage" #> I #> "Hébergement et restauration" #> J #> "Information et communication" #> K #> "Activités financières, d'assurance et immobilières" #> L #> "Activités financières, d'assurance et immobilières" #> M #> "Activités spécialisées, scientifiques et techniques" #> N #> "Activités de services administratifs et de soutien" #> P #> "Enseignement" #> Q #> "Santé humaine et action sociale" #> [other] "Hors champ" #> $sexe #> # a character `fmtsas` object #> 1 2 #> "Homme" "Femme" #> ## Utilisation : # soit un jeu de donnees contenant des codes a convertir en libelles donnees <- data.frame( ACT_CODE = c( "B", NA, "C", "P", "W", "F"), REG_CODE = c("94", "04", "44", "09", "01", NA) ) # pour remplacer les codes par les libelles (pour ACT_CODE) donnees$ACT_LIB <- conv$a13_[donnees$ACT_CODE] donnees$ACT_LIB2 <- conv$a13_[donnees$ACT_CODE, keep_na = TRUE] donnees$REG_LIB <- conv$reg[donnees$REG_CODE] donnees #> ACT_CODE REG_CODE ACT_LIB ACT_LIB2 REG_LIB #> 1 B 94 Industrie Industrie Corse #> 2 <NA> 04 Hors champ <NA> La Réunion #> 3 C 44 Industrie Industrie Grand Est #> 4 P 09 Enseignement Enseignement 09 #> 5 W 01 Hors champ Hors champ Guadeloupe #> 6 F <NA> Construction Construction <NA>