2016-03-21 13 views
1

生徒が答えた質問に関するデータがあります。フォーマットはこの例では、このような多肢選択式質問の正解数を計算する

Student  Q1 Q2 Q3 Q4 
A   1 3 2 3 
B   2 3 2 2  
C   1 2 1 2 
D   3 3 1 2 

で、1を言うことができます質問1、2の正しい答えは、私は統計テーブルを生成する方法質問2,3および4

ための正しい答えでありますこれは、学生が正しく答えた質問をいくつか教えてくれるだろうか?上記の例では、それは

Student Answered Correct: 
A   2/4 
+0

私は配列解決のファンです - この場合は、比較を返すカスタム関数を作成することを検討します。 – Reeza

答えて

2

正しい答えの配列を作成し、生徒の回答をループして比較することができます。

最後の変数を、表示された形式で表示する文字として作成しました。明らかに、これは基になる値にアクセスできないことを意味するので、他の分析目的のためにデータに正解の数を保持したいかもしれません。

data have; 
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 
; 
run; 

data want; 
set have; 
array correct{4} (1 2 3 4); /* create array of correct answers */ 
array answer{4} q1-q4; /* create array of student answers */ 
_count=0; /* reset count to 0 */ 
do i = 1 to dim(correct); 
    if answer{i} = correct{i} then _count+1; /* compare student answer to correct answer and increment count by 1 if they match */ 
end; 
length answered_correct $8; /* set length for variable */ 
answered_correct = catx('/',_count,dim(correct)); /* display result in required format */ 
drop q: correct: i _count; /* drop unwanted variables */ 
run; 
0

ファーストのようなものを言うでしょう、あなたは変数num_questionsを作成して、質問の数に設定する必要があります。次に、回答が正しいかどうかを確認するためにバイナリ変数(フラグ)を作成するために質問としてif-then-else文を多く書く必要があります(例:Correct_Q1)。 sum(of Correct:)を使用して、各生徒の正解の合計を取得してください。 Correct:は、 'Correct'で始まるすべての変数名を参照します。

data want; 
    set have; 
    num_questions = 4; 
    if Q1 = 1 then Correct_Q1 = 1; else Correct_Q1 = 0; 
    if Q2 = 2 then Correct_Q2 = 1; else Correct_Q2 = 0; 
    if Q3 = 2 then Correct_Q3 = 1; else Correct_Q3 = 0; 
    if Q4 = 2 then Correct_Q4 = 1; else Correct_Q4 = 0; 
    format Answered_Correct $3. Answered_Correct_pct percent.; 
    Answered_Correct = compress(put(sum(of Correct:),$8.)||'/'||put(num_questions, 8.)); 
    Answered_Correct_pct = sum(of Correct:)/num_questions; 
    label Student = 'Student' Answered_Correct = 'Answered correct' Answered_Correct_pct = 'Answered correct (%)'; 
    keep Student Answered_Correct Answered_Correct_pct; 
run; 

proc print data=want noobs label; 
run; 
0

あなたが唯一の最速の解決策は、おそらく条件文を使用することであろうだけで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; 
関連する問題