2016-03-21 20 views
1

Öğrencilerin cevapladığı sorular hakkında veri aldım. biçim 2 Ben bir istatistik tablosu üretecektir nasıl doğru soru 2,3 ​​için cevap ve 4.Çoktan seçmeli soruların doğru sayısının hesaplanması

olduğunu, bu Örneğin

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 

şekildedir 1 soru 1 için doğru cevaptır diyelim Bir öğrencinin cevapladığı kaç soru olduğunu bana söyleyebilir mi? Yukarıdaki örnekte, sahip olduğunuz

Student Answered Correct: 
A   2/4 
+0

Dizi çözümünün bir hayranıyım - ancak bu durumda, karşılaştırmayı döndüren özel bir işlev oluşturmayı düşünebilirim. – Reeza

cevap

2

Doğru cevaplardan oluşan bir dizi oluşturabilir, daha sonra bunları karşılaştırmak için öğrenci yanıtlarını kullanabilirsiniz.

Gösterdiğiniz biçimde görüntülemek için son değişkeni karakter olarak oluşturdum. Açıkçası bu, altta yatan değere erişemeyeceğiniz anlamına gelir, dolayısıyla diğer analiz amaçları için verilere doğru cevapların sayısını tutmak isteyebilirsiniz.

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

Birinci gibi bir şey num_questions değişken oluşturmak için söyleyebilirim ve soruların sayısına ayarlayın. Daha sonra, her bir cevabın doğru olup olmadığını kontrol etmek için ikili değişkenler (bayraklar) oluşturmak için soru olarak if-then-else ifadelerini yazmanız gerekir (ör. Correct_Q1). Her öğrenci için toplam doğru cevapları almak için sum(of Correct:) kullanın. Correct:, 'Doğru' ile başlayan tüm değişken isimlerine başvurur.

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

sadece sadece dört sorunuz varsa hızlı çözümün muhtemelen sadece koşullu ifadeler kullanmak olacaktır: bir arama/cevap tablosu kullanılarak daha genel çözüm için if Q1 = 1 then answer + 1; :

verileri hukuka aktarılması, birleştirme Tabloya cevap verin, öğrenciyi özetler.

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; 

sql isterseniz/tek bir deyimde son iki datasteps + türlü birleştirebilirsiniz kodunuzu sıkıştırmak istiyorum.

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; 
İlgili konular