SAS数组,如果它在任何列中都包含特定值,则可以设置值



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) );

最新更新