把每个param名添加到每组的第一行;不同的param排序赋予ord值;数组下标越界报错;不知变量是否存在时的填补方法

1.

%let i=1;

data shell0;

length name1 name2 $100 _4 _3 _2 _1 _999 $20;

do i=1 to &nparam;

name1="&&param&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="&&param&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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值