如何使用SAS创建虚拟变量以指示两个值相同

时间:2014-07-29 09:28:59

标签: sas dummy-data

我的数据如下:

ID      YEAR    A   B
1078    1989    1   0
1078    1999    1   1
1161    1969    0   0
1161    2002    1   1
1230    1995    0   0
1230    2002    0   1
1279    1996    0   0
1279    2003    0   1
1447    1993    1   0
1447    2001    1   1
1487    1967    0   0
1487    2008    1   1
1487    2008    1   0
1487    2009    0   1
1678    1979    1   0
1678    2002    1   1
1690    1989    1   0
1690    1993    0   1
1690    1993    0   0
1690    1996    0   1
1690    1996    0   0
1690    1997    1   1

我想创建两个虚拟变量new和X,场景如下: 在每个ID-B对中(一对是2个观察,一个B=0,另一个B=1YEAR壁橱顺序排列)

  1. 如果B=1的观察对A的值为1,则对于该对中的两个观察值都为new=1,否则对于该对中的两个观察值均为0,并且
  2. 如果该对在A中具有相同的值,则为X=0,如果它们具有不同的值,则为X=1
  3. 因此,输出将是:

    ID      YEAR    A   B   new X
    1078    1989    1   0   1   0
    1078    1999    1   1   1   0
    1161    1969    0   0   1   1
    1161    2002    1   1   1   1
    1230    1995    0   0   0   0
    1230    2002    0   1   0   0
    1279    1996    0   0   0   0
    1279    2003    0   1   0   0
    1447    1993    1   0   1   1
    1447    2001    1   1   1   1
    1487    1967    0   0   1   1
    1487    2008    1   1   1   1
    1487    2008    1   0   0   1
    1487    2009    0   1   0   1
    1678    1979    1   0   1   0
    1678    2002    1   1   1   0
    1690    1989    1   0   0   1
    1690    1993    0   1   0   1
    1690    1993    0   0   0   0
    1690    1996    0   1   0   0
    1690    1996    0   0   1   1
    1690    1997    1   1   1   1
    

    我的代码是

    data want;
     set have;
     by ID;
     if B=1 and A=1 then new=1;
     else new=0;
    run;
    
    proc sql;
        create table out as
        select a.*,max(a.B=a.A & a.B=1) as new,^(min(A)=max(A)) as X
        from have a
        group by ID;quit;
    

    第一个不起作用,第二个重新排序变量B.我被困在这里。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

你需要对first./last进行一些研究。处理和滞后功能。

这里有帮助的人已经让你到了这一点,也许以此为契机阅读SAS' Support Site的文件。

高层:

  • 您需要一个条件语句来逐步执行ID组中的每个观察
  • 找出该组中有多少观察结果(让他们说N obs)
  • 如果任何障碍物符合您提到的逻辑
  • ,则举报
  • 滞后N obs并将您的新设置为1或0

答案 1 :(得分:0)

非常手动的解决方案,我只是使用retain语句来识别对(数据集已按所需顺序排列)。

    data start;
        set start;
        retain pair 0;
        if B=0 then pair=pair+1;
    run;

    data ForNew;
        set start(where=(B=1));
        New=(A=B);  /*Boolean variable=1 if the condition in brackets is true*/
        keep pair New;
    run;
/*if A has equal values mean will be 0 or 1*/
    proc means data=start NWAY NOPRINT;
        class pair;
        var A;
        output out=ForX(drop=_: where=(media in (0,1)) keep=pair media) mean(A)=media;
    run;

    data end;
        merge start ForNew ForX(in=INX drop=media);
        by pair;
        X=(^INX);
    run;