Прежде всего, было бы лучше, если бы вы опубликовали формат, в котором вы получаете данные опроса, поскольку это будет диктовать самый простой / быстрый подход в целом.
Кроме того, как правило, лучше всего правильно настроить входы и выходы в немакрос-коде SAS, а затем использовать макросы для оптимизации процесса и т. Д. Так проще отлаживать - даже для тех, кто используетмакросы в течение длительного времени ...:)
Тем не менее, из вашего кода Proc SQL видно, что:
a.вы получаете ответы в одном текстовом поле с разделителями, например, «a, b, c» или «b, c» или «a, b, z»
*** example data;
data work.answers;
length answer $10.;
input answer;
datalines;
a,b,c
a
b
b,c
NO
a,b,z
n
run;
*** example valid answer entries;
data work.valid;
length valid $10.;
input valid;
datalines;
a
b
c
NO
YES
run;
b.Вы хотите проверить каждую запись ответа и сгенерировать счетчики, например:
NO 1
YES 0
a 3
b 4
c 2
Многие способы сделать это в SAS, но для разбора токенизированных текстовых данных удобна дедуплицированная таблица поиска с использованием объекта хеша.Приведенный ниже код также выводит в журнал следующее для отладки / проверки ...
answer=a,b,c num_answers=3 val=a val=b val=c validated=a,b,c
answer=a num_answers=1 val=a validated=a
answer=b num_answers=1 val=b validated=b
answer=b,c num_answers=2 val=b val=c validated=b,c
answer=NO num_answers=1 val=NO validated=NO
answer=a,b,z num_answers=3 val=a val=b val=z -invalid validated=a,b, validated=a,b,
answer=n num_answers=1 val=n -invalid validated= validated=
После того, как вы освоили синтаксис объявления для хеш-объекта, это довольно логично и относительно быстро.И, конечно, вы можете добавить правила проверки - такие как прописные и строчные записи ...
*** first, de-duplicate your lookup table. ;
proc sort data=work.valid nodupkey;
by valid;
run;
data _null_;
length valid $10. answer_count 4. count 4. validated $10.;
retain count 0;
*** initialize & load hash object ;
if _N_ = 1 then do;
declare hash h(multidata: 'n', ordered: 'y');
rc = h.defineKey('valid');
rc = h.defineData('valid','count');
rc = h.defineDone();
do until(eof1);
set work.valid end=eof1;
h.add();
end;
end;
*** now process questions/answers;
do until(eof);
*** read each answer;
set answers end=eof;
num_answers=countw(answer);
putlog answer= num_answers= @;
*** parse each answer entry;
validated=answer;
do i=1 to num_answers;
val=scan(answer,i);
putlog val= @;
*** (optional) keep track of total #answers: valid + invalid;
answer_count+1;
*** check answer entry in lookup table;
rc= h.find(key:val);
*** if entry NOT in lookup table, remove from validated answer;
if rc ne 0 then do;
putlog "-invalid " @;
validated=tranwrd(validated,trim(val),' ');
end;
*** if answer found, increment counter in lookup table;
else do;
count+1;
h.replace();
end;
end;
putlog validated=;
end;
*** save table of answer counts to disk;
if eof then h.output(dataset: 'work.counts');
run;