【问题标题】:Compare Value of Current Observation with First Observation比较当前观察值与首次观察值
【发布时间】:2016-03-19 00:54:18
【问题描述】:

我有一组包含 45 个问题的调查的多项选择回答,我已将正确的回答作为我在数据集中的第一个观察结果。

在我的 DATA 步骤中,我想将值设置为 0 或 1,具体取决于每个观察中的变量是否与第一个观察中的相同变量匹配,我想将响应字母 (A-D) 替换为 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;

提前致谢!

【问题讨论】:

    标签: sas


    【解决方案1】:

    我可以这样做。创建一个数据集以 PROC 比较观察到的关键。然后你有 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;
    

    【讨论】:

    • 我相信这可能是一个可靠的解决方案,我只是尽量不使用我不理解的代码,并且这使用了一些我不知道的 SAS 功能。
    • @Eckster 我本可以向您展示如何使用数组等来做到这一点,但其中的乐趣是什么。我向您展示了您可能从未想过的三种非常有用的技术。数组很好,但 SAS 不仅仅是数据步骤和数组。
    【解决方案2】:

    我家里没有 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;
    

    【讨论】:

    • 我喜欢你的简单回答,只是有几个问题,它不是 FOR 循环,而是 DO 循环,你必须将你的 ARRAY 标记为字符数组,最后,如果你修复这些问题,只有第一行得到纠正,因为 ARRAY 在每个循环中都被重新分配并且它只有 1 行。
    • 好吧,正如我所说,我无法测试代码,因为我在家里没有许可证 :)。不过,我希望你能使用这个概念,并让它发挥作用。
    • 好吧,我从合并中删除了 answers_correct 并使用 SET answers_correct 让它出现在每个观察的顶部,现在它可以工作了,所以我会把你的答案标记为我的答案,但我认为它'如果能更新就好了。
    • 当然,如果你能把实际有效的代码发给我,我很乐意更新答案
    猜你喜欢
    • 1970-01-01
    • 2019-03-07
    • 2012-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多