这是我的数据集:姓名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 (因为第一个是列中的位置),对于Math3是BC2,因为即使我们在与AA1和BB1相同的行上有一个1,这两个标记已经在var Math1和Math2中使用了。
这是输出数据集应该是什么样子
data Student2;
input name $ Math1 $ Math2 $ Math3 $;
datalines;
Justin AA1 BB1 BC2
;我可以使用数组来做这件事吗?
发布于 2012-01-08 05:16:29
在这种情况下,数组可能不够。下面是一个使用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;https://stackoverflow.com/questions/8755921
复制相似问题