SAS:通过ID识别最后一个非缺失值

时间:2019-09-05 12:21:36

标签: sas

我有这个数据集:

data temp;
input ID X;
 datalines;
1 210
1 65
1 8
1 .
1 .
1 .
2 230
2 50
2 .
2 .
2 .
2 .
;

我想创建一个新的变量Y,当它是ID列X中最后一个不丢失的值时,它的值是1,否则它的值是0:

ID X    Y
1 210   0
1 65    0
1 8     1
1 .     0
1 .     0
1 .     0
2 230   0
2 50    1
2 .     0
2 .     0
2 .     0
2 .     0
;

我已经尝试过这段代码,但是没有给我想要的结果:

DATA temp;
set temp;
by ID;
retain date ;
IF first.ID  then Y= 0;
if X ne . then Y= 1;
run;

感谢您的帮助!

4 个答案:

答案 0 :(得分:2)

如果您只希望Y = 1中每个X的最后不丢失id,即使有多个具有相同ID值的行,也可以尝试以下操作:;

data want;
do _n_ = 1 by 1 until(last.id);
  set temp;
  by ID;
  if not(missing(X)) then last_non_missing = _n_;
end;
do _n_ = 1 to _n_;
  set temp;
  Y = _n_ = last_non_missing;
  output;
end;
drop last_non_missing;
run;

答案 1 :(得分:1)

假设

您要标记每个非缺失值,然后标记一个缺失值或另一个ID的观察值

添加x缺失的指示符。

这将允许by处理。

data temp_vw / view=temp_vw;
    set temp;
    x_missing = missing(x);
run;

(我做了一个视图,以减少磁盘访问,这不是必需的机器人。)

现在通过处理使用它:

对于每个x的实数,将Y设置为true,对于相同的x,不跟随另一个ID的实数。

data want;
    set temp_vw;
    by id x_missing notsorted;
    y = not x_missing and last.x_missing;
    drop x_missing;
run;

notsorted选项可避免在缺少值后接实值的错误。)

答案 2 :(得分:1)

一种简单的方法是

PROC SORT DATA=TEMP;
BY ID X;

DATA TWO;
SET TEMP;
BY ID;
Z=LAG(X);
IF FIRST.ID NE 1 THEN DO;
IF X>. AND Z=. THEN Y=1;
ELSE Y=O;
END;

PROC SORT DATA=TWO OUT=FINAL;
BY ID DESCENDING X; 
RUN;

假设其余数据类似示例。

以交互方式运行并查看每个数据集,以确保它们可以正常运行。然后,如果需要,您可以精简。

答案 3 :(得分:0)

假设

您只想标记每个ID的最后最后一个不丢失的值

对于每个ID,找出哪个观测值

我在这里使用自动临时变量_n_;

data temp_vw / view=temp_vw;
    set temp;
    by id;

    retain last_non_missing;
    if first.id then last_non_missing = .;
    if not missing(x) then last_non_missing = _n_;

    if last.id;
    keep ID last_non_missing;
run;

(我做了一个视图,以减少磁盘访问,这不是必需的机器人。)

现在通过处理使用它:

对于x的每个实数值,将Y设置为true,对于相同的x,不跟随另一个ID的实数值;

data want;
    merge temp temp_vw;
    by ID;
    y = _n_ = last_non_missing;
    drop last_non_missing;
run;