繁体   English   中英

SAS:数据步骤中的非顺序do循环

[英]SAS: Non-sequential do loop within a data step

我希望能够对一组非顺序值执行do循环。 我编写此代码的方式将为每个值运行一个新的数据步骤-因此最终产品是一个数据表,其中添加了仅用于do循环最终值的列。 我想要的是让varlst中的值遍历if / then语句-从而向表中添加多个列-而不每次都执行新的数据步骤(这只会导致向表中添加最后一列)。

输入数据

DATA have;
INPUT id order Q3 Q5 Q6 Q50 Q75 Q102;
DATALINES;
 1  1  2 0  7 2 2 0
 1  2  3 0  5 5 3 0
 3  1  6 1  7 2 7 1
 3  2  6 0  7 5 7 0
 6  1  3 1  4 7 7 2
 6  2  5 2  7 7 7 1
 7  1  3 5  6 5 3 0
 7  2  4 1  7 5 2 1
 9  1  4 1  6 5 6 1
 9  2  1 3  5 7 5 0
; 
run;

/ ******** /

 %macro test;
    %let varlst=2 3 5 6 50 75 102 /*more values*/;
    %do i=1 %to %sysfunc(countw(&varlst));
    %let value=%scan(&varlst,&i);
    data want;
    set have;
    by id order;
    if Q&value ne lag(Q&value) and not first.id then do; 
            Q&value.Equal = 0; 
                end;
        if Q&value=lag(Q&value) and not first.id then do;
        Q&value.Equal = 1;
                end;
                %end;
       run;
    %mend;
    %test;

/ ********** /输出

id  order   Q3  Q5  Q6  Q50  Q75 Q102 Q102Equal
1   1       2    0   7   2    2   0     .
1   2       3    0   5   5    3   0     1
3   1       6    1   7   2    7   1     .
3   2       6    0   7   5    7   0     0
6   1       3    1   4   7    7   2     .
6   2       5    2   7   7    7   1     0
7   1       3    5   6   5    3   0     .
7   2       4    1   7   5    2   1     0
9   1       4    1   6   5    6   1     .
9   2       1    3   5   7    5   0     0

为什么不尝试使用PROC COMPARE

data have ;
  input id  order   Q3  Q5  Q6  Q50  Q75 Q102;
cards;
1   1       2    0   7   2    2   0     .
1   2       3    0   5   5    3   0     1
3   1       6    1   7   2    7   1     .
3   2       6    0   7   5    7   0     0
6   1       3    1   4   7    7   2     .
6   2       5    2   7   7    7   1     0
7   1       3    5   6   5    3   0     .
7   2       4    1   7   5    2   1     0
9   1       4    1   6   5    6   1     .
9   2       1    3   5   7    5   0     0
;;;;

proc compare
   data=have(where=(order=1))
   compare=have(where=(order=2)) 
   outdiff out=want 
;
  id id ;
  var q: ;
run;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM