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)

Arguments

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 quote = "simple".

source

conserver le code SAS dans un attribut "source" de l'objet en sortie.

Value

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.

Details

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.

See also

from_tab pour importer les formats contenus dans une table SAS.

Examples

## 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>