Frage

Ich suche nach einer Möglichkeit, eine String -Variable zu erstellen, die bestimmte Werte des Datensatzes enthält, während ich den Datenschritt durchläufst.

Beispiel Datensatz Work.test:

AddToStringYN    Value
     Y           One
     Y           Two
     N           Three
     Y           Four
     N           Five

Am Ende würde die Variable also so aussehen: Onetwofour (oder noch besser vier). Das sieht so einfach aus, aber ich kann keinen Weg finden, es zu tun. Ich habe auch versucht, mit solchen Makrovariablen zu arbeiten:

%let stringvar=;
Data _null_;
  set work.test;
  if AddToStringYN = "Y" then do;
    call symput('stringvar',"&stringvar" || strip(value));
  end;
Run;

Aber das gibt:

GLOBAL STRINGVAR Four

Also bekomme ich nur den letzten Wert. Ich verstehe, dass dies auf ein Missverständnis von mir über diese Makrofunktion liegen muss, aber ich verstehe nicht, warum es nur den letzten Wert in der Variablen gibt. Ich dachte, es sei nur das letzte Mal, dass das Symput genannt wurde, dass es tatsächlich ausgeführt wurde oder so, aber wenn ich den Code an eingestellt habe:

%let stringvar=;
Data _null_;
  set work.test;
  if AddToStringYN = "Y" then do;
    call symput('stringvar'||strip(value),"&stringvar" || strip(value));
  end;
Run;

Dann bekomme ich sie alle:

GLOBAL STRINGVARONE  One
GLOBAL STRINGVARTWO  Two
GLOBAL STRINGVARFOUR  Four

Meine letzte Vermutung ist also, dass die Zeile "Call symput ..." dem Makroprozessor tatsächlich hinzugefügt wird, in dem der "& StringVar" bereits ersetzt ist, und erst nach der endgültigen Aussage werden sie alle ausgeführt.
Ist das eine gute Annahme oder gibt es eine andere Erklärung? Und zurück zur ursprünglichen Frage: Gibt es eine einfache Möglichkeit, dies zu erreichen (mit der gewünschten Variablen)?

War es hilfreich?

Lösung

Grüße scheint einfach genug, hier ist meine Lösung:

data a;
set test end=eof;
length cat $100.;
retain cat;
if AddToStringYN = "Y" then do;
   cat=trim(left(cat))||trim(left(value));
end;
if eof then do;
   call symput("VAR",cat);
   output;
end;
run;

%put VAR=&VAR;

In diesem Beispiel haben Sie die Verkettung Ihrer Variablen in einem Datensatz in der Spalte "Katze" und Sie haben eine makrovariable VAR mit derselben Liste

Andere Tipps

Das Folgende ist meine Antwort auf Ihre identische Frage auf Runsubmit.com. Ich denke, Sie und @Fabio können die Lösung zu überbinden, es benötigt überhaupt keinen iterierenden Datenschrittcode ...

Erstens ist die einfache Möglichkeit, das zu tun, was Sie versuchen zu tun, Folgendes:

proc sql;
  select Value into :StringVar separated by ''
    from work.test
    where AddToStringYN='Y'
    ;
quit;

Hier können Sie die SQL -Schnittstelle mit SAS/Makro nutzen, indem Sie die select into Syntax. Sie könnten sogar eine hinzufügen order by Klausel, um eine bestimmte Bestellung zu erhalten, nach der Sie suchen.

Zweitens, da Sie auf etwas über die Art und Weise gekommen sind, wie SAS MACRO funktioniert und Sie es verstehen möchten: In Ihrem ersten Beispiel ist das erste, was der Compiler tut, bevor Sie Ihren Code ausführen, um den Wert von zu beheben &stringvar, was an diesem Punkt leer ist. Nachdem die Zusammenstellung mit diesem Token ersetzt wurde, sieht Ihr Code für SAS so aus ...

%let stringvar=;
Data _null_;
  set work.test;
  if AddToStringYN = "Y" then do;
    call symput('stringvar',"" || strip(value));
  end;
Run;

... Dann leitet SAS diesen Code aus (der zufällig gültiger Code ist, aber eine leere Zeichenfolge zum Beginn von etwas verkettet). Und aufgrund der Art und Weise, wie der Datenschritt funktioniert, ersetzt jede Iteration des Datenschritts tatsächlich den Wert von StringVar, Aus diesem Grund bleibt am Ende des Datenschritts der letzte Wert, der gelesen wurde.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top