Thema
Eine alphanumerische Variable aus einer anderen alphanumerischen Variable mithilfe der Funktion put erstellen: Vermeidung einer Kürzung aufgrund von nicht im Format vorhandenen Werten
Schlüsselwörter
*function #put *format #proc format #(default=)
#other
Daten
data lb; length lbtest $40; lbtest='Hematocrit'; output; lbtest='Leukocytes'; output; lbtest='HDL Cholesterol/Total Cholesterol'; output; run;
Programm
proc format; value $lbtest 'Hematocrit' ='HCT' 'Leukocytes' ='WBC' 'HDL Cholesterol'='HDL'; value $lbtestcd 'HCT'='Hematocrit' 'WBC'='Leukocytes' 'HDL'='HDL Cholesterol'; run; data lb_new; set lb; length lbtestcd $40; lbtestcd=put(lbtest,$lbtest.); run;
Die Variable lbtestcd
wird mit Hilfe der Variable lbtest
und dem Format $lbtest.
erstellt.
Ziel ist es, aus dem langen Namen des Labortests dessen Kurzbezeichnung zu ermitteln.
Hematocrit
wird zuHCT
Leukozytes
wird zuWBC
- Der Wert "
HDL Cholesterol/Total Cholesterol
" ist im Format$lbtest.
nicht vorhanden. Es wird zu "HDL
", was eine andere Bedeutung hat. Entsprechend dem Format$lbtestcd.
bedeutet diesHDL Cholesterol
.
a) Aufgabe
Anzeige der Länge und der Standardlänge der Formatbeschriftung ($lbtest.)
- Benutzung der Option fmtlib
- Durch Speichern von Formatangaben in einer Datei.
Possible Solution 1
proc format fmtlib; select $lbtest; run;
Possible Solution 2
proc format cntlout=lbtest; select $lbtest; run; proc print data=lbtest noobs; var fmtname start label min max length default; run;
Die Breite des Formatlabels ist die maximale Anzahl von Zeichen in der Variable LABEL
.
Die Default-Breite des Formatlabels entspricht der Länge der Formatlabelen, sofern bei der Erstellung des Formats kein anderer Wert angegeben wurde. In diesem Beispiel ist die Default-Breite des Formatlabels 3.
b) Frage
Warum wird "HDL Cholesterol/Total Cholesterol
" zu "HDL
"?
Possible Solution
Die Default-Breite des Formatlabels, 3, wird in der Funktion put verwendet, da keine andere Breite eingestellt ist, um den Default-Wert zu überschreiben.
Da kein Code im Format mit dem Wert "HDL Cholesterol/Total Cholesterol
" übereinstimmt, wird der gesamte Text kopiert, aber aufgrund der Breite des Formatlabels werden nur die ersten drei Zeichen übernommen.
Die Variablenlänge von 40 löst das Problem nicht. Sie könnte die Zeichenfolge nur weiter verkürzen, wenn ihr Wert kleiner ist als die verwendete Breite des Formatlabels.
c) Aufgabe
Aktualisieren Sie das Programm, um den vollständigen Testnamen in der Variablen lbtestcd
anzuzeigen, wenn keine Übereinstimmung im Format vorhanden ist.
- Ändern Sie die Default-Länge des Formatlabels beim Erstellen des Formats, oder
- Ändern Sie die in der Funktion put angegebene Breite des Formatlabels
Vorher |
Nachher |
Possible Solution 1
proc format; value $lbtest (default=40) 'Hematocrit' ='HCT' 'Leukocytes' ='WBC' 'HDL Cholesterol'='HDL'; run; data lb_new; set lb; *length lbtestcd $40; lbtestcd=put(lbtest,$lbtest.); run;
Possible Solution 2
Die Default-Breite des Formatlabels kann überschrieben werden, wenn das Format in der Funktion put verwendet wird.
data lb_new; set lb; *length lbtestcd $40; lbtestcd=put(lbtest,$lbtest40.); run;
d) Task
Aktualisieren Sie das Programm, um den Text "To Check
" anzuzeigen, wenn keine Übereinstimmung im Format vorhanden ist.
Vorher |
Nachher |
Possible Solution
proc format; value $lbtest 'Hematocrit' ='HCT' 'Leukocytes' ='WBC' 'HDL Cholesterol'='HDL' other ='To Check'; run; data lb_new; set lb; length lbtestcd $40; lbtestcd=put(lbtest,$lbtest.); run;