In DATA step makro variable inkrementieren.

Werbung
News
Artikel
Foren
Join
Projekte
List
Links
Random
Über Redscope
Previous
Next
Startseite › Foren › Allgemeine Fragen zu SAS
In DATA step makro variable inkrementieren.
11 October, 2010 - 12:10 — Thiele
Guten Tag!
Das ist mein erster Beitrag im Forum. Habe schon länger mitgelesen und hilfreiche Sachen
gefunden! Habe Problem bezgl des Data step, wahrscheinlich wurde schon mal ähnliches diskutiert,
habe aber nichts gefunden.
Als (sinnfreies) Beispiel hier mal:
DATA alt;
LENGTH PersonName $ 10 Surname $ 10;
PersonName = "Bert";
Surname = "Sesam";
OUTPUT;
PersonName = "Ernie";
Surname = "Sesam";
OUTPUT;
PersonName = "Donald";
Surname = "Duck";
OUTPUT;
RUN;
DATA _NULL_;
SET alt;
CALL SYMPUT("name"||STRIP(_N_), PersonName);
RUN;
%LET i = 0;
Data test;
SET alt;
%LET i = %EVAL(&i + 1); /* Hier ist mein Problem, diese Anweisung wird erst nach Ende des
Datasteps ausgeführt, gibt es eine Möglichkeit wie man i SOFORT um eins inkrementieren kann?*/
IF STRIP(PersonName) ^= '' THEN DO;
&&name&i = "Mr. or Mrs."||STRIP(Surname);
END;
RUN;
Mit freundlichen Grüßen
Thile
Foren:
Allgemeine Fragen zu SAS
Log in or register to post comments
Hallo, was ist der Ziel des
11 October, 2010 - 13:22 — SteffenM
Hallo,
was ist der Ziel des Programms, das Wunschergebnis?
Grüße
SteffenM
Log in or register to post comments
Macro-Code
11 October, 2010 - 14:04 — HansKneilmann
Hallo Thile,
egal was das eigentliche Ziel dieses Programms ist, bei der Programmierung mit SAS-Macro ist
wichtig sich vorzustellen, dass man den vom Macro-Compiler erzeugten Code selbst
geschrieben hätte.
Denn genau das macht der Macro-Compiler im Prinzip. Es wird Base-Code erzeugt, der dann
vom Base-Interpreter/-Compiler abgearbeitet wird.
Der Wechsel zw. Base-Interpreter/-Compiler und Macro-Compiler (und wieder zurück) passiert
zwischen jeden Proc- bzw. Data-Step.
Gruß
Hans Kneilmann, Schäfer Shop GmbH (SSI)
Log in or register to post comments
Ziel wäre dieses Dataset
11 October, 2010 - 15:44 — Thiele
PersonName Surname Bert
Ernie
Donald
Bert
Sesam Mr. or Mrs. Sesam
Ernie
Sesam
Mr. or Mrs. Sesam
Donald
Duck
Mr. or Mrs. Duck
Log in or register to post comments
Einfach noch mal den Kram...
11 October, 2010 - 14:20 — Frederik_Bloch
Hallo Thile,
wenn ich das richtig verstanden habe, willst du einfach ein Set von vorhandenen Macrovariablen
anders füllen.
Warum nicht einfach noch mal mit CALL SYMPUT überschreiben?
DATA alt;
LENGTH PersonName $ 10 Surname $ 10;
PersonName = "Bert";
Surname = "Sesam";
OUTPUT;
PersonName = "Ernie";
Surname = "Sesam";
OUTPUT;
PersonName = "Donald";
Surname = "Duck";
OUTPUT;
RUN;
DATA _NULL_;
SET alt;
CALL SYMPUT("name"||STRIP(_N_), PersonName);
RUN;
Data _null_;
SET alt;
IF STRIP(PersonName) ^= '' THEN DO;
call symput("name"||STRIP(_N_),"Mr. or Mrs."||STRIP(Surname));
END;
RUN;
Im letzten Datastep erzeuge ich jetzt keine SAS-Datei, wenn ja eh nur die Macrovariablen geändert
werden sollen.
Oder wolltest du jetzt eine SAS-Datei erzeugen, dir zusätzliche Variablen enthält?
Gruß Frederik
Log in or register to post comments
Danke für die Antworten.Ja,
11 October, 2010 - 15:48 — Thiele
Danke für die Antworten.
Ja, das Ziel wären zusätzliche Variablen im Dataset:
PersonName Surnam Bert
Ernie
Donald
Bert
Sesam Mr. or Mrs. Sesam
Ernie
Sesam
Mr. or Mrs. Sesam
Donald
Duck
Mr. or Mrs. Duck
Ich will die Makrovariablen (name1 - name3) als Varaiblenname haben, aber ich kann sie nicht
ansprechen weil ich nicht weiß wie ich i während des data step inkrementieren soll.
Log in or register to post comments
Lösung
11 October, 2010 - 16:06 — HansKneilmann
Hallo,
auf die schnelle eine Lösung, nicht sehr schön, aber sie klappt:
DATA alt;
LENGTH PersonName $ 10 Surname $ 10;
PersonName = "Bert";
Surname = "Sesam";
OUTPUT;
PersonName = "Ernie";
Surname = "Sesam";
OUTPUT;
PersonName = "Donald";
Surname = "Duck";
OUTPUT;
RUN;
DATA _NULL_;
SET alt;
CALL SYMPUT("name"||STRIP(_N_), PersonName);
RUN;
%macro xxx;
Data aaa;
SET alt;
%do ii=1 %to 3;
if _N_ = &ii. then do; &&name&ii. = "Mr. or Mrs."||STRIP(Surname); end;
%END;
RUN;
%mend xxx;
%xxx;
proc print;
run;
Gruß
Hans Kneilmann, Schäfer Shop GmbH (SSI)
Log in or register to post comments
Jawoll, das ist ja ne schöne
13 October, 2010 - 18:21 — Thiele
Jawoll, das ist ja ne schöne Holzhammerlösung! Danke.
Log in or register to post comments
Lösung 2
11 October, 2010 - 16:09 — SteffenM
Hallo,
programmiertechnisch bin ich ein Fan der Trennung von Erzeugen von SAS-Codes mittels
Makro und der eigentlichen Ausführung des SAS-Codes, weil ich eine Vermischung fast
immer unübersichtlich finde.
Wenn es nur um die Anlage der Variablen geht, würde ich wie folgt verfahren:
DATA alt;
LENGTH PersonName $ 10 Surname $ 10;
PersonName = "Bert";
Surname = "Sesam";
OUTPUT;
PersonName = "Ernie";
Surname = "Sesam";
OUTPUT;
PersonName = "Donald";
Surname = "Duck";
OUTPUT;
RUN;
* Erzeugen des SAS-Codes für den Datastep (wird in die Makrovariable neue_Variablen_an
proc sql;
select cat("if PersonName = '",strip(PersonName),"' then ",PersonName," = 'Mr. or Mrs
into :neue_Variablen_anlegen separated by " "
from work.alt
order by PersonName
;
quit;
* Ausführen des erzeugten Codes;
data work.neu;
set work.alt;
&neue_Variablen_anlegen.;
run;
Grüße
SteffenM
Log in or register to post comments
Führe mir den Code mal
13 October, 2010 - 19:07 — Thiele
Führe mir den Code mal zugute, sieht elegant aus, danke auf jeden Fall!
Log in or register to post comments
Herunterladen