2016-05-30 5 views
0

Ich bin auf der Suche nach einer Möglichkeit, einen normalen Variablenwert als Makrovariable in einem Datenschritt zu verwenden.Verwenden Sie eine Variable als Makro Variable Datenschritt

Zum Beispiel habe ich Makrovariable & statesList_Syphilis = AAA
und andere Makrovariable & statesList_Giardia = BBB

Und in einem Daten Schritt Ich habe eine Variable Germ Wich enthält zwei Zeilen: " Syphilis "und" Giardia ".

In meiner Daten Schritt muss ich AAA wenn Iteration über der ersten Reihe, wenn Germ = "Syphilis"
und BBB wenn iterieren der zweiten Reihe finden, wenn Germ = "Giardia"

ein Versuch, würde so aussehen

%let statesList_Syphilis = AAA; 
%let statesList_Giardia = BBB; 

data test; 
    set mytablewithgerms; * contains variable Germ ; 

    * use germ and store it in &germ macro variable ; 
    * something like %let germ = germ; or call symput ('germ',germ); 

    * I want to be able to do this; 
    xxx = "&&statesList_&germ"; * would give xxx = "AAA" or xxx = "BBB"; 

    * or this; 
    &&statesList_&germ = "test"; * would give AAA = "test" or BBB = "test"; 

    run; 

ich glaube nicht, dass dies möglich ist, aber ich dachte, ich sicher zu sein, nur fragen würde.

Danke!


EDIT (Fragen in den Kommentaren Folgen, ich hinzufüge Kontext zu meinem speziellen Problem, aber ich fühle mich ist dies die Dinge noch komplizierter zu machen):

Dies war ein Versuch, das Problem zu vereinfachen.

In Wirklichkeit AAA und BBB sind lange Listen von Wörtern wie

"asymptomatic_1 fulminant_1 chronic_1 chronic_1 fatalFulminant_1 hepatocellular_1 compensated_1 hepatocellular_2 decompensated_1 fatalHepatocellular_1 fatalHepatocellular_2 fatalDecompensated_1" 

Und ich möchte nicht in einer Variablen diese lange Zeichenfolge speichern, ich will jedes Wort davon iterieren String in einer do-Schleife mit so etwas wie:

%do k=1 %to %sysfunc(countw(&&statesList_&germ)); 
     %let state = %scan(&&statesList_&germ, &k); 
     * some other code here ; 
    %end; 

EDIT2:
hier ist eine vollständigere Sicht auf mein Problem:

%macro dummy(); 

data DALY1; 
    * set lengths ; 
    length Germ $10 Category1 $50 Category2 $50 AgeGroupDALY $10 Gender $2 value 8 stateList$999; 

    * make link to hash table ; 
    if _n_=1 then do; 

     *modelvalues ----------------; 
     declare hash h1(dataset:'modelData'); 
     h1.definekey ('Germ', 'Category1', 'Category2', 'AgeGroupDALY', 'Gender') ; 
     h1.definedata('Value'); 
     h1.definedone(); 
     call missing(Germ, Value, Category1, Category2); 
     * e.g. 
      rc=h1.find(KEY:Germ, KEY:"ssssssssss", KEY:"ppppppppppp", KEY:AgeGroupDALY, KEY:Gender); 

     *states ---------------------; 
     declare hash h2(dataset:'states'); 
     h2.definekey ('Germ') ; 
     h2.definedata('stateList'); 
     h2.definedone(); 

    end; 

    set DALY_agregate; 

    put "°°°°° _n_=" _n_; 

    DALY=0; * addition of terms ; 



    rc2=h2.find(KEY:Germ); * this creates the variable statesList; 

    put "statesList =" statesList; 

    * here i need statesList as a macro variable,; 

    %do k=1 %to %sysfunc(countw(&statesList)); *e.g. acute_1 asymptomatic_1 ...; 
     %let state = %scan(&statesList, &k); 
     put "=== &k &state"; 
     &state = 1; * multiplication of terms ; 

     * more code here; 
    %end; 


run; 
%mend dummy; 
%dummy; 

EDIT3:
Die Eingabedatei sieht wie folgt aus

Germ AgeGroup1 AgeGroup2 Gender Cases Year 
V_HBV 15-19 15-19 M 12 2015 
V_HBV 15-19 15-19 M 8 2016 
V_HBV 20-24 20-24 F 37 2011 
V_HBV 20-24 20-24 F 46 2012 
V_HBV 20-24 20-24 F 66 2013 

Die Ausgabe-Datensatz in der Zeichenfolge enthaltenen Variablen hinzufügen wird definiert durch die Makrovariable, die von der deutschen abhängt.

z.B. für V_HBV wird es diese Variablen erstellen: asymptomatic_1 fulminant_1 chronic_1 chronic_1 fatalFulminant_1 hepatocellular_1 compensated_1 hepatocellular_2 decompensated_1 fatalHepatocellular_1 fatalHepatocellular_2 fatalDecompensated_1

+0

Wie viele Beobachtungen hat Ihr Datensatz? Sie könnten dies mit zwei Datensätzen lösen, eine Makrovariable für jede Beobachtung in der ersten Datenkette erstellen und dann über alle Makrovariablen in einer Makroschleife im zweiten Datensatz iterieren, aber dies macht nur Sinn, wenn Ihre Daten nicht zu groß sind. Auch das ist nur ein vereinfachtes Beispiel, denn sonst könnte man das ohne eine Makrovariable lösen? – kl78

+2

Können Sie Beispiel "haben" und "wollen" Datensätze zur Verfügung stellen? Ich nehme an, Sie haben einen breiten Datensatz mit vielen Zuständen in jeder dieser zwei Reihen? – superfluous

+0

Aktualisierte die Frage mit mehr Code und Perspektive. –

Antwort

0

ich nicht das große Bild folgende bin, aber einer der vorherigen Iterationen Ihrer Frage hatte einen Code (Pseudo-Code) das veranschaulicht mögliche Verwirrung darüber, wie die Makrosprache funktioniert. Betrachten wir diesen Schritt:

data _null_; 
    germ="Syph"; 
    call symput('germ',germ); 
    %let Germ=%sysfunc(cats(germ)); 
    put "germ = &germ"; 
run; 
%put &germ; 

Das Protokoll von dem in einem frischen SAS-Sitzung zeigt Ausführung:

1 data _null_; 
2  germ="Syph"; 
3  call symput('germ',germ); 
4  %let Germ=%sysfunc(cats(germ)); 
5  put "germ = &germ"; 
6 run; 

germ = germ 

7 %put &germ; 
Syph 

die über Nun lassen Sie reden, was passiert. Ich werde die Zeilennummern aus dem Protokoll verwenden.

Zeile 2 weist der Datenschrittvariable keim die Zeichenfolge Syph zu. Nichts Besonderes.

Zeile 3 erstellt eine Makrovariable namens Germ und ordnet sie im Wert der Variablen datastep keim zu. Es weist ihm den Wert Syph zu. Diese CALL SYMPUT-Anweisung wird ausgeführt, wenn der Datenschritt ausgeführt wird.

Zeile 4 ist eine Makro-Anweisung% let. Es erstellt eine Makrovariable namens Germ und weist ihr den Wert keim zu. Da dies eine Makroanweisung ist, wird sie ausgeführt, bevor einer der DATA STEP-Codes ausgeführt wurde. Es kennt keine Datenschrittvariablen. Zeile 4 entspricht% Germ = Keim. Für die Makrosprache ist die rechte Seite nur ein vierstelliger String-Keim. Es ist nicht der Name einer Datenschrittvariable. % syfunc (cats()) tut nichts, weil es keine Liste von zu verkettenden Elementen gibt.

Zeile 5 ist eine Datenschritt-PUT-Anweisung. Die Makroreferenz & wird aufgelöst, während der Datenschritt kompiliert wird. An diesem Punkt wird die Makrovariable keim in Germ aufgelöst, da die% LET-Anweisung ausgeführt wurde (die Anweisung CALL SYMPUT wurde noch nicht ausgeführt).

Zeile 7 ist eine% PUT-Anweisung, die ausgeführt wird, nachdem der Schritt DATA NULL abgeschlossen wurde (und nachdem das CALL SYMPUT den Wert Syph in die Makrovariable Germ geschrieben hat).

Grundsätzlich ist es schwierig (und ungewöhnlich), einen einzigen Datenschritt zu haben, in dem Sie Daten verwenden, um eine Makrovariable zu erstellen (z. B. über Call symput) und diese Makrovariable im selben Schritt zu verwenden Referenzieren der Makrovariablen). Makroreferenzen werden aufgelöst, bevor einer der Datenschrittcodes ausgeführt wird.

In der Regel, wenn Ihre Daten bereits in einem Datensatz sind, können Sie mit Datenschrittanweisungen (DO-Schleifen statt% DO-Schleifen usw.) erhalten, was Sie wollen. Alternativ können Sie einen DATA-Schritt verwenden, um Ihre Makrovariablen zu generieren, und ein zweiter DATA-Schritt kann auf sie verweisen.

Hoffe, dass hilft.