2016-03-19 20 views
1

私は、45個の質問を含むアンケートから複数の選択肢の回答があり、データセットの最初の観測として正しい回答を配置しました。現在の観測値と最初の観測値の比較

私のデータステップでは、各観測の変数が最初の観測で同じ変数と一致するかどうかによって、値を0または1に設定したいと思います。応答文字(AD)を0または1に置き換えますデータセット、その比較を行うにはどうしたらいいですか?

私はグループ化を行っていないので、First.xを使って最初の行にアクセスすることができますが、各変数(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 | 

現在のコード:事前に

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; 

ありがとう!

答えて

1

私は自宅でこのSASライセンスを持っていないので、実際にこのコードをテストすることはできません。しかし、私はそれを私に最高のショットを与えるでしょう...

まず、別のテーブルに私の正解を保持し、merge回答者からの回答でそれを維持したいと思います。また、割り当てIDにも参加しているので、同じテーブルで複数のソリューションと回答を選択する必要がある場合は、ソリューションをスケーラブルにすることもできます。

これで、すべての正解を表answers_correctにインポートし、列名はanswer_correct1-answer_correct45になりました。

次に、2つのテーブルを結合して、各質問の結果を決定します。

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

私はそれはそれはDOだ、FORループではありません、それでだけでいくつかの問題、あなたの応答のシンプルさが好きARRAYを文字配列としてマークし、最後にこれらの問題を修正すると、ARRAYが各ループに再割り当てされ、1行しかないので、最初の行だけが修正されます。 – Ecksters

+0

私が言ったように、私はこのコードをテストすることができません。なぜなら私は自宅でライセンスを持っていないからです。私はあなたがコンセプトを使うことができて、それを機能させることを願っています。 –

+0

まあ、私はマージからanswers_correctを削除し、SETのanswers_correctを使用して各観測にトップに表示され、現在は動作していますので、私はあなたの回答を私の回答にしますが、もしあればいいと思う更新しました。 – Ecksters

2

これはどのように行うのですか。 PROCにデータセットを作成し、キーを観測値と比較します。次に、Xと一致するキーが見つからず一致しないためにXがあります。 PROC TRANSREGを使用して 'X'をスコアリングすることができます。 PROC TRANSREGは、新しい変数の名前と番号を含むマクロ変数も作成します。ログNOTEから

:_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

これはたぶん固い解決策だと私は信じています。私は理解していない、私が気づいていない機能です。 – Ecksters

+0

@Eckster配列などでそれを行う方法を教えてもらえましたが、その点では楽しいことです。私は、あなたが思ったことのない3つの非常に有用なテクニックを紹介しました。配列は問題ありませんが、SASはデータのステップや配列よりもはるかに優れています。 –

関連する問題