2012-01-06 95 views
0

这里是我的数据集: Name 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 
     ; 

我想评价MATH1和输出旁边如果遇到1的关口,但是因为Math1中使用了该位置,Math2中不能再使用该位置,即输出Justin的Math1为AA1,Math2的BB1输出(因为这是第一个位于的位置)列)和BC2,因为即使我们在AA1和BB1的同一行上有1,这两个标记已经在var Math1和Math2中使用过了。

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

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

我能做到这一点使用数组?

+0

这似乎是一个问题,涉及在输出解决方案数据集之前操纵输入数据集。如果您可以发布更准确的输入数据集视图,可以找到解决方案。你能否在数据库中包含数据步骤,以便可以测试解决方案? – 2012-01-06 13:35:12

+0

是否有从math1到math3的强制性命令?例如如果第二行是“Justin BB1 0 0 1”,那么我们跳过这一行或输出bb1并跳过第四行bc2,因为已经使用了math3? – 2012-01-07 10:05:20

+0

这是正确的Robbie我们跳过了这一行,因为1在这种情况下是一个指示符1在第三列中,所以我们在第四行输出标记。这个标记必须是唯一的,即不能输出两次 - 这是困难的部分 – Makoto 2012-01-07 10:39:40

回答

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; 
+0

感谢罗比 - 伟大的解决方案 - 我认为它可能涉及IML - 我是否正在游荡是否有办法绕过它 – Makoto 2012-01-08 02:57:11