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