我需要为表中的某些列名添加前缀。目前的名称范围从_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
,因此无效。我必须改变什么?
答案 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;