2014-09-29 92 views
1

我在數據集調查中有幾個變量。我想寫一個循環來將每個變量加載到SAS宏。將每個變量循環到SAS宏中

代碼如下。

%let var= r1 r2 r3 ; 

DATA survey; 
    INPUT id sex $ age inc r1 r2 r3 ; 
    DATALINES; 
1 F 35 17 7 2 2 
17 M 50 14 5 5 3 
33 F 45 6 7 2 7 
49 M 24 14 7 5 7 
65 F 52 9 4 7 7 
81 M 44 11 7 7 7 
2 F 34 17 6 5 3 
18 M 40 14 7 5 2 
34 F 47 6 6 5 6 
50 M 35 17 5 7 5 
; 

%MACRO bvars(input); 

proc univariate data = "D:\hsb2" plots; 
var &input.; 
run; 

%MEND bvars; 

我只想每次& VAR可以加載到宏觀bvars只有一個變量,而不是寫以下的。

%bvars(r1) 
%bvars(r2) 
%bvars(r3) 
..... 

這是耗時的,而變量的數量是大於100

+0

如果你沒有指定一個var語句,proc univariate將運行所有的數值變量。或者對所有數字變量嘗試var _numeric_。該數字應該有一個下劃線之前和之後,但SO是吃它:( – Reeza 2014-09-30 21:38:33

+0

這種有用的,但不是真的,手動經歷這麼多的輸出將是痛苦的,你到底真的在做什麼? – Reeza 2014-09-30 21:41:13

回答

-1

更新的答案。

您可以利用爲每個庫中的每個SAS數據集(包括工作庫)自動創建的VCOLUMN表。此表包含SAS中每個數據集的每個變量的一行。

所以你會做以下。我假設你的survery數據集在工作庫中。

因此,代碼執行以下操作; 1.在Vcolumn表中查找您的數據集,並只保留變量的名稱(即我們需要的)並將其存儲到數據集temp中。 2.對於每個變量,通過調用execute語句運行bvars Marcro。

data temp(keep=name); 
set Sashelp.Vcolumn; 
where libname = 'WORK' and memname = 'SURVEY'; 
run; 

*Call macro using call execute; 
data _null_; 
set temp; 
call execute ("%bvars("||name||");"); 
run; 
+0

我運行它,但它不起作用您可以嘗試使用其他方法而不是使用Vcolumn嗎?因爲調查數據只是一個測試數據集,謝謝您! – user3525837 2014-09-30 00:47:33

+0

您也可以在測試數據集上運行它。轉到Sashelp目錄,然後查看V列表,並檢查你的數據集是否出現在表中 – dannmate 2014-09-30 00:53:56

+0

另外,什麼是錯誤信息? – dannmate 2014-09-30 00:54:26

1

這將爲所有survay與 「R」(所以R1,R2等)開始運行變量proc univariate。使用var聲明的過程通常會接受多個變量。

proc univariate data = survey; 
    var r:; 
run; 

如果您希望爲所有數值變量運行與_NUM_取代r:

如果你想循環遍歷變量並在每次有幾種方法時分別調用一個函數。通常它們涉及宏做循環(必須是宏中的),像這樣:

%macro looper(inData); 
    /* List all the variable names */ 
    proc contents data = &inData. out = _colNames noprint; 
    run; 
    proc sql noprint; 
     select name 
     /* Put the variable names in a macro variable list */ 
     into :colNames separated by " " 
     from _colNames 
     /* Get only numeric variables */ 
     where type = 1 
     order by varnum; 
    quit; 
    /* Loop through the variable names */ 
    %do i = 1 %to %sysfunc(countw(&colNames.)); 
     %let colName = %scan(&colNAmes., &i.); 
     %put &colName.; 
     /* Your macro call or code here */ 
     /* %bvars(&inData., &colName.) */ 
    %end; 
%mend looper; 
%looper(sashelp.cars); 

它可能證明是有用的,爲您熟悉宏%do循環,proc contents(或更好,但proc datasets),該%scan()功能以及分配宏變量的不同方法。網上的sas文檔是一個很好的開始。