1.
%let i=1;
data shell0;
length name1 name2 $100 _4 _3 _2 _1 _999 $20;
do i=1 to &nparam;
name1="&¶m&i"; seq=0;output;
ord=i;
name2='正常';seq=1;output;
name2='异常无临床意义';seq=2;output;
name2='异常有临床意义';seq=3;output;
name2='未查';seq=4;output;
name2='总计';seq=5;output;
%let i=%eval(&i+1);
end;
_4=''; _3=''; _2=''; _1=''; _999='';
drop i;
run;
结果:
思路:可以把param的subtitle和下面内容分开写两个数据集,再用ord,seq排序
data shell0;
length name2 $100 _4 _3 _2 _1 _999 $20;
do i=1 to &nparam;
ord=i;
name2='正常';seq=1;output;
name2='异常无临床意义';seq=2;output;
name2='异常有临床意义';seq=3;output;
name2='未查';seq=4;output;
name2='总计';seq=5;output;
end;
_4=''; _3=''; _2=''; _1=''; _999='';
drop i;
run;
%macro sub_param();
data sub_param;
length name1 $100;
%local i;
%do i=1 %to &nparam;
name1="&¶m&i"; *需要先按paramn排序,做macro时保证param1、param2……和param准确对应;
ord=&i;
seq=0;
output;
%end;
run;
%mend;
%sub_param();
data shell1;
set shell0 sub_param;
proc sort;
by ord seq;
run;
2.
如何给不同的param按顺序赋予ord值?
retain ord 0;
if first.paramn=1 then ord+1;
3.
array num2 _numeric_;
array pct[5] pct1 pct2 pct3 pct4 pct999;
do over num2;
if index(vname(num2),'_') then do;
if num2=0 then pct[i]='0';
else pct[i]=strip(put(num2,best.))||put(num2/&ntrt*100,perct.);
end;
end;
因为未知数值型变量有几个,array pct的变量个数可能会超过array num2的变量个数,导致提示ERROR: 数组下标越界
4. 如果不知道这个变量是否存在,可以用如下方法填补
if _1=. then _1=0;*如果数据集中没有_1这个变量,会自动补上_1变量;
if _2=. then _2=0;
if _3=. then _3=0;
if _4=. then _4=0;