sas向列名添加前缀

sas向列名添加前缀,sas,Sas,我需要为表中的某些列名添加前缀。目前的名称范围从\u 15到\u 49,我只想添加前缀N,给出N\u 15,…,N\u 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; 但

我需要为表中的某些列名添加前缀。目前的名称范围从
\u 15
\u 49
,我只想添加前缀
N
,给出
N\u 15
,…,
N\u 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;

但是,这没有任何作用,因为我只是在日志输出中获得消息
未选择任何行。我必须更改什么?

我从sas网站()找到了以下代码:


您的特殊问题是WHERE子句没有被任何行满足,可能是因为:
和memname='Freq\u nais\u 2006\u 2010'
。在SAS中,成员名称通常在内部大写,即使它们在代码中没有大写


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

您只需在代码中的rename语句中列出它们,不需要宏或其他任何东西。尽管最好的办法是在第一时间尽量避免。请参阅下面的重命名语句

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;
你非常接近:

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数据集中使用;修改重命名…
语句。
旁注:datastep变量答案完全重写了数据集,这对于实际使用(大表)来说是无效和危险的,而且对您正在做的事情也不太清楚。

这些列名通常是从PROC转置创建的,因为不允许使用数字名,所以在PROC转置中添加了下划线。PROC TRANSPOSE有一个内置的选项来添加前缀,因此值得查看列的创建位置
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;