|
楼上各位没有理解楼主的意思呀,呵呵
写了个宏,能够解决你的问题。
我假定数据a有三题选择题,题号开头分别为q01,q02和q03,每一题的选项数目分别是4、5和3,在引用宏的时候,要按照每一题的选项数写入系统变量里,就像我对宏的引用:%mult(4,5,3);。你有50题的话,就把这50题的选项数写到宏引用句子里。
比较尴尬的是,你的数据集命名规则没统一,前面还是q010的,后面就成了q04了,少了一个0。这个你就改改名字吧,统统改成q0n的形式。
data a;
input id $ q011-q014 q021-q025 q031-q033;
datalines;
001 1 . . . 1 . . . . 1 . .
002 . 1 . . . . 1 . . 1 . .
003 . . 1 . . 1 . . . . 1 .
004 . . . 1 . . . . 1 . . 1
;
run;
%macro mult / parmbuff;
%if &syspbuff ne %then %do;
%let i=1;
%let ii=%scan(&syspbuff,&i);
%do %while(&ii ne);
data c;
set a;
%do j=1 %to 3;/*一共三题,故循环至3*/
%let j=%sysfunc(cats(0,&j));
array q&j{&ii} q&j.1-q&j.ⅈ
do k=1 to ⅈ
if q&j{k}=1 then q&j{k}=k;
end;
sq&j=sum(of q&j.1-q&j.&ii);
drop q&j.1-q&j.&ii k;
%let i=%eval(&i+1);
%let ii=%scan(&syspbuff,&i);
%end;
run;
%end;
%end;
%mend;
%mult(4,5,3);
下面这个宏也是可以的:
%macro mult / parmbuff;
%if &syspbuff ne %then %do;
%let i=1;
%let ii=%scan(&syspbuff,&i);
%do %while(&ii ne);
data c;
set a;
%do j=1 %to 3;/*一共三题,故循环至3*/
%let j=%sysfunc(cats(0,&j));
%do iii=1 %to ⅈ
if q&j.&iii= 1 then sq&j=&iii;
%end;
drop q&j.1-q&j.ⅈ
%let i=%eval(&i+1);
%let ii=%scan(&syspbuff,&i);
%end;
run;
%end;
%end;
%mend;
%mult(4,5,3);
|