用第二行中的值替换第一行

时间:2018-04-16 04:11:02

标签: sas

我的数据集在每个唯一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

3 个答案:

答案 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;