输出观察是否符合标准

时间:2012-01-06 09:42:39

标签: sas

这是我的数据集:     名称Mark Math1 Math2 Math3     -------------------------------------

Justin  AA1 1   0   1   
Justin  BB1 1   1   1   
Justin  BA1 0   1   0
Justin      BC2 0       0       1

以下是创建它的SAS代码

         DATA Student1;
         INPUT Name $  Mark $ Math1 Math2 Math3;
        DATALINES;
        Justin  AA1  1 0 1
        Justin  BB1  1 1 1
        Justin  BA1  0 1 0
        Justin  BC2  0 0 1
        ;

如果遇到1,我想评估Math1并在其旁边输出标记,但是因为该位置在Math1中使用,所以不能在Math2中再次使用,即输出Justin为Math1的AA1,Math2的BB1(因为那是第一个在列中的位置)和Math2的BC2,因为即使我们在AA1和BB1的同一行上有一个1,这两个标记已经在var Math1和Math2中使用。

这就是输出数据集应该是什么样的

       data Student2;
       input name $ Math1 $ Math2 $ Math3 $;
        datalines;
       Justin AA1 BB1 BC2
       ;

我可以使用数组吗?

1 个答案:

答案 0 :(得分:0)

在这种情况下,数组可能还不够。以下是使用IML的解决方案(有希望)(虽然看起来很笨重)。我推测您可能需要与多个学生打交道,因此请将其应用于多个名称的情况。如果有任何错误,请评论。

  DATA Student1;
    INPUT Name $  Mark $ Math1 Math2 Math3;
      DATALINES;
        Justin  AA1  1 0 1
        Justin  BB1  1 1 1
        Justin  BA1  0 1 0
        Justin  BC2  0 0 1
        Wayne   AB1  1 0 1
        Wayne   BC1   0 0 1
        Wayne  BD2    0 1 0
        Wayne  BE3   1 1 1
        ;
  quit;

proc iml;
  use student1;
  read all var{name mark} into x;
  read all var{math1 math2 math3} into y;
z=j(nrow(y),ncol(y),'mon');
i=1;
   do j=2 to nrow(x);
     if x[j,1]^=x[j-1,1] | j=nrow(x) then do;
      if j=nrow(x) then j=j+1;
        do k=1 to 3;
          do l=i to j-1;
            if y[l,k]=1 then do;
             y[l,k:3]=0;
             y[l+1:j-1,k]=0;
             z[i:j-1,k]=x[l,2];
             end;
           end;
         end;
         i=j;
     end;
    end;
    colname={'math1', 'math2', 'math3'};
create new from z[colname=colname];
append from z;
quit;

data new;
merge student1(keep=name) new;
run;

proc sort data=new out=new nodupkey;
by name;
run;