1.一个简单的例子
data class;
set sashelp.class;
array vars[*] Age Height Weight; /*vars为数组名,[*]表示通过计算数组元素个数确定数组下标*/
do i=1 to dim(vars); /*dim为数组函数,表示求数组x第一维的元素的个数*/
VARNAME=vlabel(vars[i]);
AVALC=vars[i];
output;
end;
run;
先拿class数据集举一个简单的例子,原数据集中每个人的人口学资料都放在同一行内,进行以上操作可以将年龄、身高、体重的信息变为竖排放置。值得注意的是,array数组内的变量需为同一类型的变量,所以该举例只对其中3个数值型变量进行了操作,性别未纳入操作。
运行结果如下:
2.adam中实现BDS结构(1)
data pe;
set pe;
array vars[*] PEGEN PESKIN PELY PEHEAD PENECK PEHT PEABD PESC PENS;
array varu[*] PEGENMO PESKINMO PELYMO PEHEADMO PENECKMO PEHTMO PEABDMO PESCMO PENSMO;
do i=1 to dim(vars);
PARAMN=i;
PARAMCD=vname(vars[i]);
PARAM=vlabel(vars[i]);
AVALC=tranwrd(tranwrd(vars[i],'异常无临床意义','NCS'),'异常有临床意义','CS');;
AVAL=whichc(AVALC,'正常','NCS','CS');
ADES=varu[i];
output;
end;
run;
以上是写项目过程中实现BDS结构比较方便的用法,其中vname取变量名作为PARAMCD值,vlabel取变量的标签名作为PARAM值,AVALC直接取变量值,ADES同理。
同时写两个数组时,这两个数组的变量个数需保持相等,有需要的话甚至可以同时写3个数组或者更多,但是实际应用中很少遇见。
3.adam中实现BDS结构(2)
data ex;
set raw.ex(in=a) raw.suex(in=b);
if a then EXATN=1;
if b then EXATN=2;
EXDSTXTS=cats(input(EXDSTXTL,best12.)+input(EXDSTXTR,best12.));
array vars[*] EXDSTXTL EXDSTXTR EXDSTXTS;
do i=1 to dim(vars);
PARAMN=(i-1)*2+EXATN;
PARAM=choosec(PARAMN,'首次注射(左侧)','补充注射(左侧)'
,'首次注射(右侧)','补充注射(右侧)'
,'首次注射(总注射量)','补充注射(总注射量)' );
PARAMCD=choosec(PARAMN,'EXRSL1','EXRSL2','EXRSR1','EXRSR2','EXRS1','EXRS2');
AVALC=vars[i];
output;
end;
run;
ex数据集为首次注射的数据,suex数据集为补充注射的数据,我觉得这样写比较巧妙的是“PARAMN=(i-1)*2+EXATN”这个地方。如果首次注射和补充注射只需分析其中的一个相同变量,甚至不用数组就可以解决,可以直接在“if a then ~”的地方完成对PARAMN的赋值。但是如果像现在这样涉及多个变量,这样写是我认为比较方便的解决方法。
不过这样写之后,有个特殊的地方,PARAMN的值因为开头赋值的原因,首次注射的PARAMN值都为奇数,补充注射的PARAMN值都为偶数,所以需要注意对应PARAMCD的赋值。