Hallo zusammen,
ich möchte aus einer großen Tabelle mit mehreren hundert Variablen bestimmte Variablen filtern und eine neue Variable erzeugen. Das Filtern der Daten klappt inzwischen super und ich erhalte eine neue Tabelle, die nur meine gewünschten Variablen enthält.
Eine dieser Variablen heißt typ_alter und beschreibt das Patientenalter jeweils in 5-Jahres Schritten. Aus dieser Variablen möchte ich nun eine neue mit dem Namen typ_alter_neu erzeugen, die das Patientenalter jedoch in 10-Jahres Schritten angibt. Dafür habe ich folgende Syntax geschrieben:
libname Haase 'C:\Users\Margaretha\Desktop\FDZ\DRG\Data'; PROC SQL; CREATE TABLE Daten_2007 AS SELECT sex, typ_alter, pat_land, icd_hd, (CASE IF '22' = typ_alter THEN 'j' IF typ_alter >= '1' AND typ_alter <= '3' THEN 'a' IF typ_alter >= '4' AND typ_alter <= '5' THEN 'b' IF typ_alter >= '6' AND typ_alter <= '7' THEN 'c' IF typ_alter >= '8' AND typ_alter <= '9' THEN 'd' IF typ_alter >= '10' AND typ_alter <= '11' THEN 'e' IF typ_alter >= '12' AND typ_alter <= '13' THEN 'f' IF typ_alter >= '14' AND typ_alter <= '15' THEN 'g' IF typ_alter >= '16' AND typ_alter <= '17' THEN 'h' IF typ_alter >= '18' AND typ_alter <= '21' THEN 'i' ELSE typ_alter END) AS typ_alter_neu FROM Haase.Drg2007_3846_sf; QUIT; PROC print; RUN;
Wenn ich dieses Programm laufen lassen will, wird mir im Log-Fenster folgendes angezeigt:
219 PROC print; ERROR: Keine Standardeinlesedatei vorhanden (_LAST_ is _NULL_). 220 RUN; NOTE: The SAS System stopped processing this step because of errors. NOTE: PROZEDUR PRINT used (Total process time): real time 0.00 seconds cpu time 0.00 seconds
Wenn ich allerdings die IF – THEN Bedingung weglasse und das Programm starte, erhalte ich eine Tabelle mit den ausgewählten Variablen. Füge ich dann die IF – THEN Bedingung hinzu, erhalte ich trotzdem nur die alte Tabelle ohne die neu definierte Variable und im Log-Fenster wird mir folgendes angezeigt:
233 libname Haase 'C:\Users\Margaretha\Desktop\FDZ\DRG\Data'; NOTE: Libref HAASE was successfully assigned as follows: Engine: V9 Physical Name: C:\Users\Margaretha\Desktop\FDZ\DRG\Data 234 PROC SQL; 235 CREATE TABLE Daten_2007 AS 236 SELECT sex, 237 typ_alter, 238 pat_land, 239 icd_hd, 240 (CASE 241 IF '22' = typ_alter THEN 'j' ---- 22 76 ERROR 22-322: Syntax error, expecting one of the following: !, !!, &, (, *, **, +, -, /, <, <=, <>, =, >, >=, AND, EQ, EQT, GE, GET, GT, GTT, LE, LET, LT, LTT, NE, NET, OR, WHEN, ^=, |, ||, ~=. ERROR 76-322: Syntax error, statement will be ignored. 242 IF typ_alter >= '1' AND typ_alter <= '3' THEN 'a' 243 IF typ_alter >= '4' AND typ_alter <= '5' THEN 'b' 244 IF typ_alter >= '6' AND typ_alter <= '7' THEN 'c' 245 IF typ_alter >= '8' AND typ_alter <= '9' THEN 'd' 246 IF typ_alter >= '10' AND typ_alter <= '11' THEN 'e' 247 IF typ_alter >= '12' AND typ_alter <= '13' THEN 'f' 248 IF typ_alter >= '14' AND typ_alter <= '15' THEN 'g' 249 IF typ_alter >= '16' AND typ_alter <= '17' THEN 'h' 250 IF typ_alter >= '18' AND typ_alter <= '21' THEN 'i' 251 ELSE typ_alter 252 END) AS typ_alter_neu 253 254 FROM Haase.Drg2007_3846_sf; 255 QUIT; NOTE: The SAS System stopped processing this step because of errors. NOTE: PROZEDUR SQL used (Total process time): real time 0.02 seconds cpu time 0.01 seconds 256 PROC print; 257 RUN; NOTE: There were 200 observations read from the data set WORK.DATEN_2007. NOTE: PROZEDUR PRINT used (Total process time): real time 0.05 seconds cpu time 0.04 seconds
Kann mir jemand bei diesem Problem helfen?
Vielen Dank und einen guten Start in die Woche!
Kann es sein, dass das Feld typ_alter nummerisch ist?
Falls ja nimm einfach die Anführungszeichen weg - das sieht für mich nach einem Typ-Missmatch aus.
Um es an einem Beispiel zu verdeutlich mit aa1 funktioniert es, mit aa2 kommt deine Fehlermeldung weil du hier dann Num mit Char vergleichst.
data work.aa1; input typ_alter $3.; length typ_alter $3.; datalines; 1 4 10 22 108 15 ; run; data work.aa2; input typ_alter; datalines; 1 4 10 22 108 15 ; run; PROC SQL; CREATE TABLE Daten_2007 AS SELECT typ_alter, CASE WHEN typ_alter >= '1' AND typ_alter <= '3' THEN 'a' WHEN typ_alter >= '4' AND typ_alter <= '5' THEN 'b' WHEN typ_alter >= '6' AND typ_alter <= '7' THEN 'c' WHEN typ_alter >= '8' AND typ_alter <= '9' THEN 'd' WHEN typ_alter >= '10' AND typ_alter <= '11' THEN 'e' WHEN typ_alter >= '12' AND typ_alter <= '13' THEN 'f' WHEN typ_alter >= '14' AND typ_alter <= '15' THEN 'g' WHEN typ_alter >= '16' AND typ_alter <= '17' THEN 'h' WHEN typ_alter >= '18' AND typ_alter <= '21' THEN 'i' WHEN typ_alter = '22' THEN 'j' ELSE typ_alter END AS typ_alter_neu FROM work.aa1; QUIT;
Hallo @Margaretha_97 ,
in proc sql funktioniert dies über case when - Beispiel:
proc sql; select Name, case when Continent = 'North America' then 'Continental U.S.' when Continent = 'Oceania' then 'Pacific Islands' else 'None' end as Region from states; quit;
Hoffe das hilft weiter. If-Statements wären im Data Step.
Viele Grüße
Criptic
Hallo @Criptic ,
vielen Dank für die schnelle Antwort!
Ich habe das IF jetzt durch WHEN ersetzt und mich an Deiner Beispielsyntax orientiert und folgende Syntax verwendet:
libname Haase 'C:\Users\Margaretha\Desktop\FDZ\DRG\Data'; PROC SQL; CREATE TABLE Daten_2007 AS SELECT sex, icd_hd, pat_land, typ_alter, CASE WHEN typ_alter >= '1' AND typ_alter <= '3' THEN 'a' WHEN typ_alter >= '4' AND typ_alter <= '5' THEN 'b' WHEN typ_alter >= '6' AND typ_alter <= '7' THEN 'c' WHEN typ_alter >= '8' AND typ_alter <= '9' THEN 'd' WHEN typ_alter >= '10' AND typ_alter <= '11' THEN 'e' WHEN typ_alter >= '12' AND typ_alter <= '13' THEN 'f' WHEN typ_alter >= '14' AND typ_alter <= '15' THEN 'g' WHEN typ_alter >= '16' AND typ_alter <= '17' THEN 'h' WHEN typ_alter >= '18' AND typ_alter <= '21' THEN 'i' WHEN typ_alter = '22' THEN 'j' ELSE typ_alter END AS typ_alter_neu FROM Haase.Drg2007_3846_sf; QUIT; PROC print; RUN;
Leider klappt es noch nicht, im Log-Fenster steht jetzt folgendes:
35 libname Haase 'C:\Users\Margaretha\Desktop\FDZ\DRG\Data'; NOTE: Libref HAASE was successfully assigned as follows: Engine: V9 Physical Name: C:\Users\Margaretha\Desktop\FDZ\DRG\Data 36 PROC SQL; 37 CREATE TABLE Daten_2007 AS 38 SELECT sex, 39 icd_hd, 40 pat_land, 41 typ_alter, CASE 42 WHEN typ_alter >= '1' AND typ_alter <= '3' THEN 'a' 43 WHEN typ_alter >= '4' AND typ_alter <= '5' THEN 'b' 44 WHEN typ_alter >= '6' AND typ_alter <= '7' THEN 'c' 45 WHEN typ_alter >= '8' AND typ_alter <= '9' THEN 'd' 46 WHEN typ_alter >= '10' AND typ_alter <= '11' THEN 'e' 47 WHEN typ_alter >= '12' AND typ_alter <= '13' THEN 'f' 48 WHEN typ_alter >= '14' AND typ_alter <= '15' THEN 'g' 49 WHEN typ_alter >= '16' AND typ_alter <= '17' THEN 'h' 50 WHEN typ_alter >= '18' AND typ_alter <= '21' THEN 'i' 51 WHEN typ_alter = '22' THEN 'j' 52 ELSE typ_alter 53 END AS typ_alter_neu 54 FROM Haase.Drg2007_3846_sf; NOTE: Datei HAASE.DRG2007_3846_SF.DATA besitzt das systemeigene Format eines anderen Host, oder die Dateicodierung entspricht nicht der Sitzungscodierung. Cross Environment Data Access wird verwendet. Dies kann weitere CPU-Ressourcen erfordern und die Performance wird beeinträchtigt. ERROR: Expression using IN has components that are of different data types. NOTE: The IN referred to may have been transformed from an OR to an IN at some point during PROC SQL WHERE clause optimization. ERROR: Expression using IN has components that are of different data types. NOTE: The IN referred to may have been transformed from an OR to an IN at some point during PROC SQL WHERE clause optimization. ERROR: Expression using IN has components that are of different data types. NOTE: The IN referred to may have been transformed from an OR to an IN at some point during PROC SQL WHERE clause optimization. ERROR: Expression using IN has components that are of different data types. NOTE: The IN referred to may have been transformed from an OR to an IN at some point during PROC SQL WHERE clause optimization. ERROR: Expression using IN has components that are of different data types. NOTE: The IN referred to may have been transformed from an OR to an IN at some point during PROC SQL WHERE clause optimization. ERROR: Expression using IN has components that are of different data types. NOTE: The IN referred to may have been transformed from an OR to an IN at some point during PROC SQL WHERE clause optimization. ERROR: Expression using IN has components that are of different data types. NOTE: The IN referred to may have been transformed from an OR to an IN at some point during PROC SQL WHERE clause optimization. ERROR: Expression using IN has components that are of different data types. NOTE: The IN referred to may have been transformed from an OR to an IN at some point during PROC SQL WHERE clause optimization. ERROR: Expression using IN has components that are of different data types. NOTE: The IN referred to may have been transformed from an OR to an IN at some point during PROC SQL WHERE clause optimization. ERROR: Expression using equals (=) has components that are of different data types. ERROR: Result of WHEN clause 11 is not the same data type as the preceding results. 55 QUIT; NOTE: The SAS System stopped processing this step because of errors. NOTE: PROZEDUR SQL used (Total process time): real time 0.04 seconds cpu time 0.04 seconds 56 PROC print; 57 RUN; NOTE: There were 200 observations read from the data set WORK.DATEN_2007. NOTE: PROZEDUR PRINT used (Total process time): real time 0.05 seconds cpu time 0.06 seconds
Hättest Du eine Idee, woran es trotz der nun geänderten Syntax liegen kann?
Liebe Grüße
Kann es sein, dass das Feld typ_alter nummerisch ist?
Falls ja nimm einfach die Anführungszeichen weg - das sieht für mich nach einem Typ-Missmatch aus.
Um es an einem Beispiel zu verdeutlich mit aa1 funktioniert es, mit aa2 kommt deine Fehlermeldung weil du hier dann Num mit Char vergleichst.
data work.aa1; input typ_alter $3.; length typ_alter $3.; datalines; 1 4 10 22 108 15 ; run; data work.aa2; input typ_alter; datalines; 1 4 10 22 108 15 ; run; PROC SQL; CREATE TABLE Daten_2007 AS SELECT typ_alter, CASE WHEN typ_alter >= '1' AND typ_alter <= '3' THEN 'a' WHEN typ_alter >= '4' AND typ_alter <= '5' THEN 'b' WHEN typ_alter >= '6' AND typ_alter <= '7' THEN 'c' WHEN typ_alter >= '8' AND typ_alter <= '9' THEN 'd' WHEN typ_alter >= '10' AND typ_alter <= '11' THEN 'e' WHEN typ_alter >= '12' AND typ_alter <= '13' THEN 'f' WHEN typ_alter >= '14' AND typ_alter <= '15' THEN 'g' WHEN typ_alter >= '16' AND typ_alter <= '17' THEN 'h' WHEN typ_alter >= '18' AND typ_alter <= '21' THEN 'i' WHEN typ_alter = '22' THEN 'j' ELSE typ_alter END AS typ_alter_neu FROM work.aa1; QUIT;
Das Problem ist gelöst! Es lag daran, dass die neu gebildete Variable nicht numerisch, sondern alphanumerisch war.
Ich habe die Buchstaben durch Zahlen ersetzt und entsprechend die Hochkommata entfernt, wie@Criptic es vorgeschlagen hatte.
Vielen Dank an alle für die umfangreiche Hilfe. Ohne Eure geduldige Hilfe wäre ich verzweifelt...
Liebe Grüße und einen schönen Abend
CREATE TABLE Daten_2007 AS
SELECT sex,
typ_alter,
pat_land,
icd_hd,
(CASE
WHEN typ_alter = '22' THEN 'j'
WHEN typ_alter in ( '1', '2', '3') THEN 'a'
WHEN typ_alter in ( '4', '5' ) THEN 'b'
WHEN typ_alter in ( '6', '7' ) THEN 'c'
WHEN typ_alter in ( '8', '9' ) THEN 'd'
WHEN typ_alter in ('10', '11' ) THEN 'e'
WHEN typ_alter in ('12', '13' ) THEN 'f'
WHEN typ_alter in ('14', '15' ) THEN 'g'
WHEN typ_alter in ('16', '17' ) THEN 'h'
WHEN typ_alter in ('18', '19, '20, '21' ) THEN 'i'
ELSE typ_alter
END) AS typ_alter_neu
FROM Haase.Drg2007_3846_sf;
Hallo @jh_ti_bw,
vielen Dank für die schnelle Antwort. Ich habe meine Syntax entsprechend geändert:
libname Haase 'C:\Users\Margaretha\Desktop\FDZ\DRG\Data'; PROC SQL; CREATE TABLE Daten_2007 AS SELECT sex, icd_hd, pat_land, typ_alter, (CASE WHEN typ_alter = '22' THEN 'j' WHEN typ_alter in ( '1', '2', '3') THEN 'a' WHEN typ_alter in ( '4', '5' ) THEN 'b' WHEN typ_alter in ( '6', '7' ) THEN 'c' WHEN typ_alter in ( '8', '9' ) THEN 'd' WHEN typ_alter in ('10', '11' ) THEN 'e' WHEN typ_alter in ('12', '13' ) THEN 'f' WHEN typ_alter in ('14', '15' ) THEN 'g' WHEN typ_alter in ('16', '17' ) THEN 'h' WHEN typ_alter in ('18', '19', '20', '21' ) THEN 'i' ELSE typ_alter END) AS typ_alter_neu FROM Haase.Drg2007_3846_sf; QUIT; PROC print; RUN;
Leider erhalte ich noch keine Tabelle mit der neuen Variablen und im Log-Fenster wird mir folgende Fehlermeldung angezeigt:
37 libname Haase 'C:\Users\Margaretha\Desktop\FDZ\DRG\Data'; NOTE: Libref HAASE was successfully assigned as follows: Engine: V9 Physical Name: C:\Users\Margaretha\Desktop\FDZ\DRG\Data 38 PROC SQL; 39 CREATE TABLE Daten_2007 AS 40 SELECT sex, 41 icd_hd, 42 pat_land, 43 typ_alter, 44 (CASE 45 WHEN typ_alter = '22' THEN 'j' 46 WHEN typ_alter in ( '1', '2', '3') THEN 'a' 47 WHEN typ_alter in ( '4', '5' ) THEN 'b' 48 WHEN typ_alter in ( '6', '7' ) THEN 'c' 49 WHEN typ_alter in ( '8', '9' ) THEN 'd' 50 WHEN typ_alter in ('10', '11' ) THEN 'e' 51 WHEN typ_alter in ('12', '13' ) THEN 'f' 52 WHEN typ_alter in ('14', '15' ) THEN 'g' 53 WHEN typ_alter in ('16', '17' ) THEN 'h' 54 WHEN typ_alter in ('18', '19', '20', '21' ) THEN 'i' 55 ELSE typ_alter 56 END) AS typ_alter_neu 57 FROM Haase.Drg2007_3846_sf; NOTE: Datei HAASE.DRG2007_3846_SF.DATA besitzt das systemeigene Format eines anderen Host, oder die Dateicodierung entspricht nicht der Sitzungscodierung. Cross Environment Data Access wird verwendet. Dies kann weitere CPU-Ressourcen erfordern und die Performance wird beeinträchtigt. ERROR: Expression using equals (=) has components that are of different data types. ERROR: Expression using IN has components that are of different data types. NOTE: The IN referred to may have been transformed from an OR to an IN at some point during PROC SQL WHERE clause optimization. ERROR: Expression using IN has components that are of different data types. NOTE: The IN referred to may have been transformed from an OR to an IN at some point during PROC SQL WHERE clause optimization. ERROR: Expression using IN has components that are of different data types. NOTE: The IN referred to may have been transformed from an OR to an IN at some point during PROC SQL WHERE clause optimization. ERROR: Expression using IN has components that are of different data types. NOTE: The IN referred to may have been transformed from an OR to an IN at some point during PROC SQL WHERE clause optimization. ERROR: Expression using IN has components that are of different data types. NOTE: The IN referred to may have been transformed from an OR to an IN at some point during PROC SQL WHERE clause optimization. ERROR: Expression using IN has components that are of different data types. NOTE: The IN referred to may have been transformed from an OR to an IN at some point during PROC SQL WHERE clause optimization. ERROR: Expression using IN has components that are of different data types. NOTE: The IN referred to may have been transformed from an OR to an IN at some point during PROC SQL WHERE clause optimization. ERROR: Expression using IN has components that are of different data types. NOTE: The IN referred to may have been transformed from an OR to an IN at some point during PROC SQL WHERE clause optimization. ERROR: Expression using IN has components that are of different data types. NOTE: The IN referred to may have been transformed from an OR to an IN at some point during PROC SQL WHERE clause optimization. ERROR: Result of WHEN clause 11 is not the same data type as the preceding results. 58 QUIT; NOTE: The SAS System stopped processing this step because of errors. NOTE: PROZEDUR SQL used (Total process time): real time 0.06 seconds cpu time 0.04 seconds 59 PROC print; 60 RUN; NOTE: There were 200 observations read from the data set WORK.DATEN_2007. NOTE: PROZEDUR PRINT used (Total process time): real time 0.05 seconds cpu time 0.04 seconds
Wo könnte mein Fehler liegen?
Liebe Grüße
@Margaretha_97: Das Problem schreit danach mit einem Format gelöst zu werden. Allerdings würde ich die Variable typ_alter zunächst von char nach numerisch konvertieren, die Reihenfolge von Zahlen in alphanumerischen Variablen ist nicht immer so, wie gehofft/erwartet. Der nachfolgende Code ist leider nicht getestet:
proc format;
value AlterTyp
1 - 3 = 'a'
4 - 5 = 'b'
6 - 7 = 'c'
...
22 = 'j'
other = ' '
;
run;
data work.Daten_2007;
set Haase.Drg2007_3846_sf(keep= typ_alter pat_land icd_hd);
length typ_alter_neu $ 1;
typ_alter_neu = put(input(typ_alter, 2.), AlterTyp.);
run;
Hallo @andreas_lds,
vielen Dank für den Tip!
Immerhin wird mir jetzt schon eine Spalte mit der Variablen typ_alter_neu angezeigt, in der jedoch keine Werte enthalten sind...
Ich habe scbon verschiedene Möglichkeiten versucht, aber probiere es weiter.
Liebe Grüße
Kannst du das Log von dem Lauf posten? Vielleicht fällt einem von uns etwas auf.
Hallo @andreas_lds,
hier das Log-Fenster:
187 libname Haase 'C:\Users\Margaretha\Desktop\FDZ\DRG\Data'; NOTE: Libref HAASE was successfully assigned as follows: Engine: V9 Physical Name: C:\Users\Margaretha\Desktop\FDZ\DRG\Data 188 PROC format; 189 value AlterTyp 190 1 - 3 = 'a' 191 4 - 5 = 'b' 192 6 - 7 = 'c' 193 8 - 9 = 'd' 194 10 - 11 = 'e' 195 12 - 13 = 'f' 196 14 - 15 = 'g' 197 16 - 17 = 'h' 198 18 - 21 = 'i' 199 22 = 'j' 200 other = ' ' 201 ; NOTE: Format ALTERTYP is already on the library WORK.FORMATS. NOTE: Format ALTERTYP has been output. 202 RUN; NOTE: PROZEDUR FORMAT used (Total process time): real time 0.00 seconds cpu time 0.00 seconds 203 204 DATA Work.Daten_2007; 205 set Haase.Drg2007_3846_sf(keep= typ_alter pat_land icd_hd); NOTE: Datei HHASE.DRG2007_3846_SF.DATA besitzt das systemeigene Format eines anderen Host, oder die Dateicodierung entspricht nicht der Sitzungscodierung. Cross Environment Data Access wird verwendet. Dies kann weitere CPU-Ressourcen erfordern und die Performance wird beeinträchtigt. 206 length typ_alter_neu $ 1; 207 208 typ_alter_neu = put(input(typ_alter, 2.), AlterTyp.); 209 run; NOTE: Numeric values have been converted to character values at the places given by: (Line):(Column). 208:27 NOTE: There were 200 observations read from the data set REEH.DRG2007_3846_SF. NOTE: The data set WORK.DATEN_2007 has 200 observations and 4 variables. NOTE: DATA statement used (Total process time): real time 0.03 seconds cpu time 0.03 seconds 210 211 PROC SQL; 212 CREATE TABLE Daten_2007 AS 213 SELECT sex, 214 typ_alter, 215 pat_land, 216 icd_hd, CASE 217 WHEN typ_alter >= 01 AND typ_alter <= 03 THEN 'a' 218 WHEN typ_alter >= 04 AND typ_alter <= 05 THEN 'b' 219 WHEN typ_alter >= 06 AND typ_alter <= 07 THEN 'c' 220 WHEN typ_alter >= 10 AND typ_alter <= 11 THEN 'e' 221 WHEN typ_alter >= 08 AND typ_alter <= 09 THEN 'd' 222 WHEN typ_alter >= 12 AND typ_alter <= 13 THEN 'f' 223 WHEN typ_alter >= 14 AND typ_alter <= 15 THEN 'g' 224 WHEN typ_alter >= 16 AND typ_alter <= 17 THEN 'h' 225 WHEN typ_alter >= 18 AND typ_alter <= 21 THEN 'i' 226 WHEN typ_alter = 22 THEN 'j' 227 ELSE typ_alter 228 END AS typ_alter_neu 229 230 FROM Haase.Drg2007_3846_sf; NOTE: Datei HAASE.DRG2007_3846_SF.DATA besitzt das systemeigene Format eines anderen Host, oder die Dateicodierung entspricht nicht der Sitzungscodierung. Cross Environment Data Access wird verwendet. Dies kann weitere CPU-Ressourcen erfordern und die Performance wird beeinträchtigt. ERROR: Result of WHEN clause 11 is not the same data type as the preceding results. 231 QUIT; NOTE: The SAS System stopped processing this step because of errors. NOTE: PROZEDUR SQL used (Total process time): real time 0.02 seconds cpu time 0.01 seconds 232 PROC print; 233 RUN; NOTE: There were 200 observations read from the data set WORK.DATEN_2007. NOTE: PROZEDUR PRINT used (Total process time): real time 0.05 seconds cpu time 0.04 seconds
Ist es überhaupt möglich, dass man die von Dir vorgeschlagene Syntax vor einem Proc SQL einfügen und zusammen mit diesem verwenden kann?
Vielen Dank für die Hilfe!
@Margaretha_97 wrote:
Hallo @andreas_lds,
hier das Log-Fenster:
ausgeschnittenIst es überhaupt möglich, dass man die von Dir vorgeschlagene Syntax vor einem Proc SQL einfügen und zusammen mit diesem verwenden kann?
Vielen Dank für die Hilfe!
Also eigentlich brauchst du die proc sql gar nicht mehr ....
Ersetze mal
typ_alter_neu = put(input(typ_alter, 2.), AlterTyp.)
durch
typ_alter_neu = put(typ_alter, AlterTyp.);
@FreelanceReinh hat ja schon in gewohnter Ausführlichkeit erklärt, warum die erste Zuweisung nicht funktionieren kann: weil die Variable gar nicht alphanumerisch ist.
@Margaretha_97 schrieb:
Immerhin wird mir jetzt schon eine Spalte mit der Variablen typ_alter_neu angezeigt, in der jedoch keine Werte enthalten sind...
Hallo @Margaretha_97,
nach den bisher gezeigten Informationen liegt das daran, dass die Variable typ_alter numerisch ist, so dass der Ausdruck
input(typ_alter, 2.)
zunächst eine automatische Konvertierung der typ_alter-Werte in rechtsbündige Character-Werte der Länge 12 bewirkt (weil die INPUT-Funktion als erstes ein Character-Argument verlangt und 12. das numerische Default-Format für diese Umwandlung ist). Im Log erscheint sicherlich
NOTE: Numeric values have been converted to character values at the places given by: ...
(oder das deutsche Äquivalent dazu). Dann werden von diesem Character-String durch das angegebene Informat 2. nur die ersten beiden Zeichen eingelesen. Das sind aber Leerzeichen, wenn der ursprüngliche numerische Wert nicht gerade mehr als zehn Stellen (im 12.-Format) beansprucht. Diese ergeben als Funktionswert ein numerisches Missing, das vom Format AlterTyp. in den "other"-Zweig eingeordnet und somit per PUT-Funktion auf ein Character-Missing abgebildet wird.
Also besteht kein Bedarf, die INPUT-Funktion anzuwenden, sondern das Format AlterTyp. kann (mit der PUT-Funktion) direkt auf typ_alter angewandt werden -- wenn die Formatdefinition zu den Werten von typ_alter passt. Daher ist erst einmal der Schritt nachzuholen, der schon vor Anwendung von WHEN-, IF- oder WHERE-Bedingungen auf typ_alter hilfreich gewesen wäre: sich Klarheit über (Variablentyp und) die Werte von typ_alter zu verschaffen.
proc contents data=Haase.Drg2007_3846_sf(keep=typ_alter);
run;
Der PROC-CONTENTS-Output liefert hier zwei wichtige Informationen: dass typ_alter numerisch ist ("Num" in Spalte "Type") und ob die Variable mit einem Format versehen ist (ggf. in Spalte "Format"), was beim Betrachten der Daten (etwa mit PROC PRINT) leicht zu Fehleinschätzungen über die tatsächlichen Werte führen kann.proc print data=Haase.Drg2007_3846_sf(obs=20);
format typ_alter;
var typ_alter;
run;
(Wenn kein Format zugeordnet ist, darf das FORMAT-Statement entfallen, es schadet aber auch nicht.)proc freq data=Haase.Drg2007_3846_sf;
format typ_alter;
tables typ_alter;
run;
(Gleicher Hinweis wie oben zum FORMAT-Statement.)Anhand der von PROC FREQ gelieferten Werte kann die Formatdefinition von AlterTyp. geprüft werden. (Im Fall nicht-ganzzahliger Werte wäre besondere Vorsicht geboten.) Auch zeigen die Häufigkeiten der Werte, welche Häufigkeitsverteilung für die neue Variable typ_alter_neu zu erwarten ist. Sich diese dann per PROC FREQ (auf Daten_2007 angewandt) auch tatsächlich anzusehen und mit der Erwartung zu vergleichen, sollte selbstverständliche Routine sein.
Hallo @FreelanceReinh,
danke für die Erklärung!
Die Variable typ_alter ist numerisch und hat 3 Stellen.
Ich werde es mit dem Tip von @andreas_lds versuchen zu erstellen.
Liebe Grüße
SAS Innovate 2025 is scheduled for May 6-9 in Orlando, FL. Sign up to be first to learn about the agenda and registration!