我的数据集在每个唯一ID的第一行中都缺少值。我想用第二行中的值替换第一行。
我的直觉告诉我解决方案涉及使用_N_
和BY
声明。
我的数据集:
ID Var1
1 .
1 12
1 23
1 2
2 .
2 266
2 23
2 2
3 .
3 6
结果我在追求:
ID Var1
1 12
1 12
1 23
1 2
2 266
2 266
2 23
2 2
3 6
3 6
答案 0 :(得分:2)
使用两个SET语句。第二个SET用于'lead'处理(而不是'lag')。第二组语句的数据集与第一组语句相同,但偏移了1行(firstobs=2)
。
data have;
input ID var1;
datalines;
1 .
1 12
1 23
1 2
2 .
2 266
2 23
2 2
3 .
3 6
run;
data want;
set have;
by id;
set have(firstobs=2 keep=id var1 rename=(id=lead1_id var1=lead1_var1));
if first.id and id=lead1_id then var1=lead1_var1;
drop lead1_id lead1_var1;
run;
答案 1 :(得分:0)
试试这个:第1步:分配id明智的行号 步骤2:使用滞后函数并用第一个id替换第二个值
data have;
input ID Var1;
cards;
1 .
1 12
1 23
1 2
2 .
2 266
2 23
2 2
3 .
3 6
;
run;
data have1;
set have;
by id;
if first.id then sno = 0;
sno+1;
run;
proc sort data=have1 out=have2;
by id descending sno ;
run;
data have3;
set have2;
var2=lag(var1);
if var1 = . then var1 = var2;
run;
proc sort data=have3 out=want(drop=sno var2);
by id sno;
run;
如有任何疑问,请与我联系。
答案 2 :(得分:0)
类似这样的事情
data want( rename=(next_var1=var1));
set have end=eof;
by id notsorted;
if first.id then do;
point = _N_ + 1;
set have (keep= var1 rename= (var1 = next_var1)) point=point;
end;
else do;
next_var1=var1;
end;
drop var1;
run;