我有这个数据集:
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;
感谢您的帮助!
答案 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的观察值
这将允许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的最后最后一个不丢失的值
我在这里使用自动临时变量_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;