2016-05-30 10 views
0

Ich habe einen Datensatz mit drei Variablen. Unterhalb ist der Beispieldatensatz.So erstellen Sie eine Makrovariable für jede eindeutige Region und einen zugewiesenen Mindestbetrag für die jeweilige Makrovariable

Id Region Amount 
1 A 20 
1 A 40 
1 A 50 
2 B 40 
2 B 30 
2 B 60 
3 C 10 
3 C 30 
4 D 20 
4 D 50 
4 D 10 

Ich möchte für jede Region eine Makrovariable erstellen und diesen Variablen dann den Mindestbetrag zuweisen. Zum Beispiel im Fall von oben Dataset Antwort sollte 4 Makrovariable mit ihrem Wert sein als:

macro_var val 
A   20 
B   30 
C   10 
D   10 

Jede mögliche Hilfe würde sehr geschätzt werden.

Antwort

0

Wählen Sie die IDs in eine Makrovariable, so dass Sie durch sie dann die Schleife und den Minimalwert Betrag für jeden finden:

data temp; 
    input Id $ Region $ Amount $; 
    datalines; 
    1 A 20 
    1 A 40 
    1 A 50 
    2 B 40 
    2 B 30 
    2 B 60 
    3 C 10 
    3 C 30 
    4 D 20 
    4 D 50 
    4 D 10 
    ; 
run; 

proc sql noprint; 
    select distinct region into: region_list separated by " " from temp; 
quit; 

%macro assign_vars; 

    %do i = 1 %to %sysfunc(countw(&region_list.)); 
    %let this_region = %scan(&region_list., &i.); 

     %global min_of_region_&this_region.; 

     proc sql noprint; 
      select min(amount) into: min_of_region_&this_region. from temp (where = (region = "&this_region.")); 
     quit; 

    %end; 


%mend assign_vars; 

%assign_vars; 

%put &min_of_region_A.; 
%put &min_of_region_B.; 
%put &min_of_region_C.; 
%put &min_of_region_D.; 
+0

Vielen Dank.Es hilft mir zu verstehen Looping über mehrere Wert der Makrovariable. Also nochmal danke. –

0

I GROUP BY Anweisung in SQL verwenden würde und dann CALL SYMPUT in einem Daten verwenden Schritt zum Erstellen von Makrovariablen:

proc sql; 
    create table temp2 as 
    select Region, min(amount) as minamount 
    from temp 
    group by Region; 
quit; 

data _null_; 
    set temp2; 
    call symput(Region,minamount); 
run; 
+0

Vielen Dank Dmitry. Dieser ist sehr nützlich und leicht zu verstehen. Also nochmal danke. –