あなたが唯一の最速の解決策は、おそらく条件文を使用することであろうだけで4つの質問がある場合:マージ、データをトランスポーズ
:検索/回答テーブルを使用して、より一般的なソリューションについてif Q1 = 1 then answer + 1;
を答え表、学生に要約する。
data broad_data;
infile datalines missover;
input Student $ Q1 Q2 Q3 Q4;
datalines;
A 1 3 2 3
B 2 3 2 2
C 1 2 1 2
D 3 3 1 2
;
data answers;
infile datalines missover;
input question $ correct_answer ;
datalines;
Q1 1
Q2 2
Q3 2
Q4 2
;
data long_data;
set broad_data;
length question $10 answer 8;
array long[*] Q1--Q4;
do i = 1 to dim(long);
question = vname(long[i]);
answer = long[i];
output;
end;
keep Student question answer;
run;
proc sort data = long_data; by question student; run;
data long_data_answers;
merge long_data
answers
;
by question;
run;
proc sort data = long_data_answers; by student; run;
data result;
do i = 1 by 1 until (last.student);
set long_data_answers;
by student;
count = sum(count, answer eq correct_answer);
end;
result = count/i;
keep student result;
format result fract8.;
run;
もしあなたがコードを圧縮したいのであれば、最後の2つのデータストア+ソートを1つのステートメントにまとめることができます。
proc sql;
create table result as
select student, sum(answer eq correct_answer)/count(*) as result format fract8.
from long_data a
inner join answers b
on a.question eq b.question
group by student
;
quit;
私は配列解決のファンです - この場合は、比較を返すカスタム関数を作成することを検討します。 – Reeza