Sas 如果符合标准,则输出观察结果
这是我的数据集: 名称马克·马修1马修2马修3 -------------------------------------Sas 如果符合标准,则输出观察结果,sas,Sas,这是我的数据集: 名称马克·马修1马修2马修3 ------------------------------------- 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 Ma
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(因为这是列中第一个位置)对于Math3,BC2,因为即使我们在同一行中有一个1,与AA1和BB1,这两个标记已经在var Math1和Math2中使用过
这就是输出数据集的外观
data Student2;
input name $ Math1 $ Math2 $ Math3 $;
datalines;
Justin AA1 BB1 BC2
;
我可以使用数组来执行此操作吗 在这种情况下,数组可能不够。下面是一个使用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;
这似乎是一个涉及在输出解决方案数据集之前操作输入数据集的问题。如果您可以发布输入数据集的更准确视图,那么可以找到解决方案。您是否可以在数据行中包含一个数据步骤,以便测试解决方案?是否有从math1到math3的强制顺序?例如,如果第二行是“Justin BB1 0 0 1”,那么我们跳过这一行或输出BB1并跳过第四行bc2,因为使用了math3?这是正确的Robbie,我们跳过这一行,因为1是一个指示符,在这种情况下,1位于第三列,所以我们在第四行输出标记。标记必须是唯一的,即不能输出两次-这是困难的一部分感谢Robbie伟大的解决方案-我认为可能涉及IML-我在想是否有办法绕过它