2016-03-19 6 views
1

Ich habe eine Reihe von Multiple-Choice-Antworten aus einer Umfrage mit 45 Fragen, und ich habe die richtige Antworten als meine erste Beobachtung in den Datensatz platziert. In meinem DATA-Schritt möchte ich Werte auf 0 oder 1 setzen, je nachdem, ob die Variable in jeder Beobachtung mit der gleichen Variablen in der ersten Beobachtung übereinstimmt, ich möchte den Antwortbuchstaben (AD) durch die 0 oder 1 in ersetzen Wie gehe ich bei diesem Vergleich vor?Vergleichen Sie den Wert der aktuellen Beobachtung mit der ersten Beobachtung

Ich mache keine Gruppierung, also glaube ich, dass ich mit First.x auf die erste Zeile zugreifen kann, aber ich bin nicht sicher, wie man das über jede Variable vergleicht (answer1-answer45).

| Id | answer1 | answer2 | ...through answer 45 
|:-------------|---------:| 
| KEY |  A |  B |  
| 2 |  A |  C | 
| 3 |  C |  D | 
| 4 |  A |  B |  
| 5 |  D |  C | 
| 6 |  B |  B | 

Should become: 

| Id | answer1 | answer2 | ...through answer 45 
|:-------------|---------:| 
| KEY |  A |  B |  
| 2 |  1 |  0 | 
| 3 |  0 |  0 | 
| 4 |  1 |  1 |  
| 5 |  0 |  0 | 
| 6 |  0 |  1 | 

Aktuelle Code für die Daten zu lesen:

DATA TEST(drop=name fill answer0); 
    INFILE SCORES DSD firstobs=2; 
    length id $4; 
    length answer1-answer150 $1; 
    INPUT name $ fill id $ (answer0-answer150) ($); 
RUN; 

Vielen Dank im Voraus!

Antwort

1

Ich habe meine SAS-Lizenz hier nicht zu Hause, also kann ich diesen Code nicht wirklich testen. Ich gebe es mir am besten, aber ...

Zuerst würde ich meine richtigen Antworten in einer separaten Tabelle, und dann merge es mit den Antworten von den Befragten. Dadurch wird die Lösung auch skalierbar, wenn Sie in derselben Tabelle mehrere Multiple-Choice-Lösungen und -Antworten haben, da Sie auch der Zuweisungs-ID beitreten.

Importieren Sie nun alle Ihre korrekten Antworten in eine Tabelle answers_correct mit den Spaltennamen answer_correct1-answer_correct45.

Dann fusionieren Sie die beiden Tabellen und bestimmen Sie das Ergebnis für jede Frage.

DATA outcome; 
    MERGE answers answers_correct; 
    * We will not be using any BY.; 
    * If you later add more questionnaires, merge BY the questionnaire ID; 
    ARRAY answer(*) answer1-answer45; 
    ARRAY answer_correct(*) answer_correct1-answer_correct45; 
    LENGTH result1-result45 $1; 
    ARRAY result(*) result1-result45; 
    DROP i; 
    FOR i = 1 TO DIM(answer); 
     IF answer(i) = answer_correct(i) THEN result(i) = '1'; 
     ELSE result(i) = '0'; 
    END; 
RUN; 
+0

ich die Einfachheit Ihrer Antwort wünschen, nur ein paar Probleme mit ihm, es ist nicht eine FOR-Schleife, ist es ein DO Schleife, müssen Sie Ihre ARRAYs als Zeichen-Arrays markieren, und schließlich, wenn Sie diese Probleme beheben, wird nur die erste Zeile korrigiert, da das ARRAY jede Schleife neu zugewiesen wird und es nur 1 Zeile hat. – Ecksters

+0

Nun, wie gesagt, ich kann den Code nicht testen, da ich meine Lizenz hier zu Hause nicht habe :). Ich hoffe, dass Sie das Konzept nutzen können und es zum Laufen bringen. –

+0

Nun, ich habe answers_correct aus der Zusammenführung entfernt und SETs answer_correct verwendet, um es bei jeder Beobachtung erscheinen zu lassen, und jetzt funktioniert es, also werde ich deine als meine Antwort markieren, aber ich denke, es wäre nett, wenn es sein könnte aktualisiert. – Ecksters

2

Hier ist, wie ich es tun könnte. Erstellen Sie einen Datensatz zu PROC VERGLEICH den Schlüssel zum beobachteten. Dann haben Sie X für nicht übereinstimmenden Schlüssel und fehlt für abgestimmt. Sie können dann PROC TRANSREG verwenden, um das "X" zu bewerten. zu 01. PROC TRANSREG erstellt auch Makrovariablen, die die Namen der neuen Variablen und die Nummer enthalten.

Von log HINWEIS: _TRGINDN = 2 _TRGIND = answer1D answer2D

data questions; 
    input id:$3. (answer1-answer2)(:$1.); 
    cards; 
KEY A B 
2 A C 
3 C D 
4 A B 
5 D C 
6 B B 
;;;; 
    run; 
data key; 
    if _n_ eq 1 then set questions(obs=1); 
    set questions(keep=id firstobs=2); 
    run; 
proc compare base=key compare=questions(firstobs=2) out=comp outdiff noprint; 
    id id; 
    run; 
options validvarname=v7; 
proc transreg design data=comp(drop=_type_ type=data); 
    id id; 
    model class(answer:)/noint; 
    output out=scored(drop=intercept _:); 
    run; 
%put NOTE: &=_TRGINDN &=_TRGIND; 

enter image description here

+0

Ich glaube, das ist wahrscheinlich eine solide Lösung, ich versuche nur nicht, Code zu verwenden, den ich nicht verstehe, und dies verwendet einige SAS Funktionalität, die mir nicht bekannt ist. – Ecksters

+0

@Eckster Ich hätte dir zeigen können, wie man es mit Arrays und dergleichen macht, aber was macht das daran? Ich habe dir drei sehr nützliche Techniken gezeigt, an die du vielleicht nie gedacht hättest. Arrays sind in Ordnung, aber SAS ist viel mehr als Datenschritte und Arrays. –

Verwandte Themen