比较当前观察的价值与初步观察

时间:2016-03-19 00:54:19

标签: sas

我从45个问题的调查中得到了一组多项选择答案,并且我已将正确的答案作为我在数据集中的第一个观察点。

在我的DATA步骤中,我想将值设置为0或1,这取决于每个观察中的变量是否与第一个观察中的相同变量匹配,我想用0或1替换响应字母(AD)数据集,我该如何进行比较?

我没有进行任何分组,所以我相信我可以使用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;

提前致谢!

2 个答案:

答案 0 :(得分:2)

这是我怎么做的。创建一个数据集到PROC COMPARE KEY到观察到的。然后你有X不匹配密钥和缺少匹配。然后,您可以使用PROC TRANSREG对“X”进行评分。'到01. PROC TRANSREG还创建宏变量,其中包含新变量和数字的名称。

来自日志注意:_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

答案 1 :(得分:1)

我家里没有SAS许可证,所以我无法实际测试此代码。我会给你最好的拍摄,但是......

首先,我会将我的正确答案保存在一个单独的表格中,然后merge将其与受访者的答案保持一致。如果您在同一个表中有更多的多项选择解决方案和答案,那么这也使解决方案具有可扩展性,因为您也可以加入作业ID。

现在,将所有正确答案导入到表answers_correct,其列名为answer_correct1-answer_correct45。

然后,合并两个表并确定每个问题的结果。

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;