Массивы SAS для установки значения, если оно обрабатывает определенное значение в любом из столбцов

#sas

#sas

Вопрос:

Я пытаюсь установить any5 = 'Yes' , есть ли число 5 в любом из столбцов от Q1 до Q5. Однако мой приведенный ниже код отображается только для последнего столбца.

 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; 
 

Ответ №1:

Сохраняйте это просто 🙂

 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
; 
 

Ответ №2:

Используйте функцию COUNTC для вычисления количества повторений 5 в ваших столбцах Q1-Q5, затем используйте функцию IFC для возврата символьного значения в зависимости от того, является ли выражение истинным, ложным или отсутствует.

 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
 

Ответ №3:

Используйте WHICHN функцию для определения индекса целевого значения в списке значений.

В вашем случае назначьте тест для любого сопоставления индексов

 any5 = whichn (5, of ques(*)) > 0;
 

Из документации:

КАКАЯ функция

Выполняет поиск числового значения, равного первому аргументу, и возвращает индекс первого соответствующего значения.

Синтаксис

WHICHN(argument, value-1 <, value-2, ...>)

Ответ №4:

Это простая ошибка в вашей логике. Вы устанавливаете для 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 вернет 1 для TRUE и 0 для FALSE в результате логического выражения.

 any5 = ( 0 < whichn(5, of Q1-Q5) );