是否有任何能夠獲取變量名稱的語句\函數? 最好將它們放入另一個數據集,文本字段或宏變量的列中。如何讀取SAS數據集中的變量名稱?
E.g.
- 數據組1
Name age sex
Jk 14 F
FH 34 M
預期的數據集
Var_name_of_dataset1
Name age sex
PS:我知道一條語句:select into,它確實相關 它可以將列的值讀入具有自定義分隔符的字段中,因此希望有類似的方式將列名讀入字段或列。
謝謝
是否有任何能夠獲取變量名稱的語句\函數? 最好將它們放入另一個數據集,文本字段或宏變量的列中。如何讀取SAS數據集中的變量名稱?
E.g.
- 數據組1
Name age sex
Jk 14 F
FH 34 M
預期的數據集
Var_name_of_dataset1
Name
age
sex
PS:我知道一條語句:select into,它確實相關 它可以將列的值讀入具有自定義分隔符的字段中,因此希望有類似的方式將列名讀入字段或列。
謝謝
PROC CONTENTS是獲取數據集中信息的最快方法。列名可以在NAME列中找到。
proc contents data=sashelp.class out=contents noprint;
run;
您還可以使用datastep和數組函數,例如,
data colnames ; set sashelp.class (obs=1) ; array n{*} _NUMERIC_ ; array c{*} _CHARACTER_ ; do i = 1 to dim(n) ; vname = vname(n{i}) ; output ; end ; do i = 1 to dim(c) ; vname = vname(c{i}) ; output ; end ; run ;
%macro getvars(dsn);
%global vlist;
proc sql;
select name into :vlist separated by ' '
from dictionary.columns
where memname=upcase("&dsn");
quit;
%mend;
這將創建一個名爲& VLIST將包含在數據集中的所有變量的名稱的宏變量,用空格隔開。如果你想在變量名之間加上逗號,你所要做的就是將「由...分開」的值從''更改爲','。在where語句中使用upcase函數可以避免有人在錯誤的情況下傳遞數據集名稱時出現問題。全局聲明是必要的,因爲創建的宏變量不一定會在宏外部可用而不將其定義爲全局
有幾個問題 - 首先,這裏的字典表可能會很慢,因爲它會查詢所有庫。其次,upcase函數會在每條記錄上觸發。%upcase會更有效。最後,爲什麼即使使用宏?這在開放代碼中可以正常工作。 – 2015-01-14 13:39:08
我不確定讀取字典表時查詢所有庫的Rawfocus斷言是否爲真,例如使用了sashelp。 vcolumn,那麼它會是真的,這種方法是非常緩慢的,並訪問所有庫分配。 (你可以用SAS RTRACE系統選項來證明這一點。)
我認爲對dictionary.columns的sql查詢是這裏概述的最快的方法。顯然,宏代碼的代碼可以在沒有宏的情況下工作,但宏觀的重點在於我認爲它是一種工具;把代碼放到你最喜歡的宏庫中,你永遠不需要再考慮它。
從SAS幫助和文檔略有改變。
%macro names(dsid);
%let dsid=%sysfunc(open(&dsid, i));
%let num=%sysfunc(attrn(&dsid,nvars));
%let varlist=;
%do i=1 %to &num ;
%let varlist=&varlist %sysfunc(varname(&dsid, &i));
%end;
%let rc = %sysfunc(close(&dsid)); /*edit by Moody_Mudskipper: omitting this line will lock the dataset */
%put varlist=&varlist;
%mend names;
%names(sasuser.class) ;
然後,我們保存案件和命令的數據,即使數字和字符混合。
非常感謝Laurent!這非常有用。 CHers – mj023119 2011-03-24 01:31:15