这是我的数据集: 名称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
;
我可以使用数组吗?
答案 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;