0

我的数据看起来像:

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.

因此,输出将是:

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 重新排序。我被困在这里。任何帮助将不胜感激。

4

2 回答 2

1

您需要对 first./last 进行一些研究。处理和滞后函数。

这里的乐于助人的人已经让您了解了这一点,也许可以借此机会阅读SAS 支持站点上的文档。

在高水平:

  • 您需要一个条件语句来逐步遍历 ID 组中的每个观察值
  • 找出该组中有多少观察值(假设 N obs)
  • 如果任何 obs 符合您提到的逻辑,请标记
  • 落后 N obs 并将你的 new 分别设置为 1 或 0
于 2014-07-29T10:40:48.777 回答
0

Very manual solution, I just used the retain statement to identify the pairs (dataset already in the required order).

    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;
于 2014-07-30T15:08:26.133 回答