2014-09-30 165 views
2

我需要爲表中的某些列名添加前綴。此刻的範圍從_15_49的名字,我只是想添加前綴NN_15,...,N_49sas爲列名添加前綴

我試過如下:

proc sql noprint; 
select cats(name,'=','N',name) 
into :prefixlist 
separated by ' ' 
from dictionary.columns 
where libname = 'WORK' and memname = 'Freq_nais_2006_2010'; 
quit; 

然而這並沒有什麼,因爲我只是在日誌輸出中看到消息no rows were selected。我必須改變什麼?

+1

這些列名稱通常由PROC TRANSPOSE創建,其中下劃線被添加,因爲不允許使用數字名稱。 PROC TRANSPOSE具有添加前綴的內置選項,因此可能需要查看創建列的位置 – Longfish 2014-09-30 16:08:26

回答

0

我設法找到從SAS網站(http://support.sas.com/kb/37/433.html)下面的代碼:

%macro vars(dsn,chr,out);                            
    %let dsid=%sysfunc(open(&dsn));                           
    %let n=%sysfunc(attrn(&dsid,nvars));                         
    data &out;                                
    set &dsn(rename=(                             
    %do i = 2 %to &n;                             
    %let var=%sysfunc(varname(&dsid,&i));                        
    &var=&chr&var                            
     %end;));                                
     %let rc=%sysfunc(close(&dsid));                           
    run;                                 
%mend vars; 

%vars(Freq_nais_2006_2010,N,Freq_nais_2006_2010); 
2

您的具體問題是,WHERE子句沒有被任何行,可能是因爲這個滿足:and memname = 'Freq_nais_2006_2010'。成員名稱通常在SAS內部大寫,即使它們沒有在您的代碼中大寫。

否則您的代碼看起來很好,您應該可以在PROC DATASETS或數據步驟重命名語句中使用該&prefixlist.。我通常建議使用PROC SQL方法,因爲它更容易自定義以指定要重命名的變量,但當然如果要重命名數據集中的所有變量,宏也可以工作。

0

您可以在代碼中的重命名語句中列出它們,不需要宏或其他任何東西。儘管最好的想法是儘可能避免它。請參閱下面的重命名語句。

data test; 
    array test(20) _1-_20; 
    do i=1 to 20; 
     test(i)=rand('normal', 20); 
    end; 
run; 

data test2; 
    set test; 
    rename _1-_20 = n_1-n_20; 
run; 
2

你是非常接近:

proc sql noprint; 
select cats(name,'=','N',name) 
into :prefixlist 
separated by ' ' 
from dictionary.columns 
where libname = 'WORK' and memname = 'FREQ_NAIS_2006_2010' 
     /* and substr(NAME,1,1) = '_' - can add condition on column name pattern */; 
quit; 

proc datasets lib=WORK nolist nodetails; 
modify FREQ_NAIS_2006_2010; 
rename 
&prefixlist 
; 
quit; 

更改分隔空間爲PROC DATASETS; MODIFY ... RENAME ...語句中使用。 備註:datastep變體應答完全重寫數據集,對於真實世界的使用(大表格)來說這是無效的和危險的,對於你在做什麼也不太清楚。