2016-05-30 27 views
0

我有一個包含三個變量的數據集。下面是示例數據集。如何爲每個唯一區域創建宏變量並將最小值分配給各個宏變量

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 

我想爲每個區域創建宏變量,然後將最小值分配給這些變量。 例如,在上述數據集的回答的情況下,應爲4宏變量與它們的價值爲:

macro_var val 
A   20 
B   30 
C   10 
D   10 

任何幫助,將不勝感激。

回答

0

選擇IDS成宏變量,這樣你就可以通過他們循環,找到量的每個最小值:

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

非常感謝,它幫助我理解了循環遍歷宏變量的多個值。再次感謝。 –

0

我將利用GROUP BY語句在SQL中,然後在數據使用CALL SYMPUT創建宏變量的步驟:

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

非常感謝德米特里。這個是非常有用和容易理解的。再次感謝。 –