sas为列名添加前缀

时间:2014-09-30 14:23:42

标签: sas

我需要为表中的某些列名添加前缀。目前的名称范围从_15_49,我只想添加前缀N以提供N_15,...,N_49

我尝试了以下内容:

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,因此无效。我必须改变什么?

4 个答案:

答案 0 :(得分:2)

您的特定问题是任何行都没有实现WHERE子句,可能是因为:and memname = 'Freq_nais_2006_2010'。成员名称通常在SAS内部大写,即使它们未在您的代码中大写。

否则您的代码看起来很好,您应该能够在&prefixlist.或数据步骤重命名语句中使用PROC DATASETS。我通常建议使用PROC SQL方法,因为它更容易自定义以指定要重命名的变量,但当然如果您重命名数据集中的所有变量,宏也可以工作。

答案 1 :(得分: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变体可以完整地重写数据集,这对于现实世界的使用(大表)是无效和危险的,对你正在做的事情也不太清楚。

答案 2 :(得分: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);

答案 3 :(得分: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;