Im试图设置any5 = 'Yes'
,如果在Q1到Q5的任何一列中有数字5。然而,我下面的代码只显示最后一列。
data survey;
infile datalines firstobs=2;
input ID 3. Q1-Q5;
array score{5} _temporary_ (5,5,5,5,5);
array Ques{5} Q1-Q5;
do i =1 to 5;
if Ques{i} = score{i} then any5='Yes';
else any5='No';
end;
drop i;
datalines;
ID Q1 Q2 Q3 Q4 Q5
535 1 3 5 4 2
12 5 5 4 4 3
723 2 1 2 1 1
7 3 5 1 4 2
;
run;
保持简单:-(
data survey;
infile datalines;
input ID 3. Q1-Q5;
array Ques{*} Q1 - Q5;
any5 = ifc(5 in Ques, 'Yes', 'No');
datalines;
535 1 3 5 4 2
12 5 5 4 4 3
723 2 1 2 1 1
7 3 5 1 4 2
;
使用COUNTC函数计算Q 1-Q5列中重复5的次数,然后使用IFC函数根据表达式是true、false还是缺失返回字符值。
data survey;
infile datalines firstobs=2;
input ID 3. Q1-Q5;
any5 = ifc(countc(cats(of Q:),'5')>0,'Yes','No');
datalines;
ID Q1 Q2 Q3 Q4 Q5
535 1 3 5 4 2
12 5 5 4 4 3
723 2 1 2 1 1
7 3 5 1 4 2
;
run;
Result:
535 1 3 5 4 2 Yes
12 5 5 4 4 3 Yes
723 2 1 2 1 1 No
7 3 5 1 4 2 Yes
使用WHICHN
函数确定值列表中目标值的索引。
在您的情况下,为任何与匹配的索引分配测试
any5 = whichn (5, of ques(*)) > 0;
来自文件:
WHICHN函数
搜索与第一个参数相等的数值,然后返回第一个匹配值的索引。
语法
WHICHN(argument, value-1 <, value-2, ...>)
这是逻辑中的一个简单错误。每次循环时,您都将ANY5设置为YES或NO。由于即使在找到匹配项后仍要继续执行循环,因此您将通过循环覆盖前几次的结果,因此只有最后一次测试的结果仍然存在。
这里有一种方法。在循环之前将答案设置为NO,并删除ELSE子句。
any5='No ';
do i =1 to 5;
if Ques{i} = 5 then any5='Yes';
end;
或者当你有答案时停下来。
do i =1 to 5 until(any5='Yes');
if Ques{i} = score{i} then any5='Yes';
else any5='No';
end;
或者完全跳过循环。
if whichn(5, of Q1-Q5) then any5='Yes';
else any5='No';
或者更容易将any5创建为数字而不是字符。作为布尔表达式的结果,SAS将为TRUE返回1,为FALSE返回0。
any5 = ( 0 < whichn(5, of Q1-Q5) );