从另一个变量

时间:2015-09-15 16:59:54

标签: sas

好的,我有一个客户ID和一个会话ID。对于多个重复会话ID的第一个,我有一个客户ID,但对于后续的我没有。我需要将我拥有的客户ID复制到同一会话中的其他空白处。我对代码的尝试如下:

proc sort data=weblogsnew1;
by session_id descending customer_id;
run;

data weblogsnew2;
set weblogsnew1;
by session_id descending customer_id;
if first.session_id then do until(last.session_id);
customer_id=first.customer_id;
end;
run;

这段代码无休止地旋转但没有任何反应?我可能需要做一些DOW循环,但我是一个相对初学者,它让我感到困惑,所以我希望有人可以给我一些方向。

Session_id ............. Customer_id
1442103120308 ..... f8d63284bc0b463a93c588fef719bee0
1442103120308 ..... 0
1442103120308 ..... 0
1442103120308 ..... 0
1442103120308 ..... 0
1442103120308 ..... 0
1442103120308 ..... 0
1442103202937 ..... 4f13e0aebdda4811834285efe9543446
1442103202937 ..... 4f13e0aebdda4811834285efe9543446
1442103202937 ..... 4f13e0aebdda4811834285efe9543446
1442103202937 ..... 4f13e0aebdda4811834285efe9543446
1442103202937 ..... 4f13e0aebdda4811834285efe9543446
1442103202937 ..... 0
1442103202937 ..... 0
1442103202937 ..... 0
1442103202937 ..... 0
1442103202937 ..... 0
1442103202937 ..... 0
1424466798849 ..... 0
1424466798849 ..... 0
1424466798849 ..... 0

在某些情况下我只有0,所以只使用retain语句将无效。

因为我对格式化点很糟糕,只是打破了两列。

3 个答案:

答案 0 :(得分:1)

我认为这样的事情会奏效:

data session;
   infile cards firstobs=2;
   input session_id :$13. dots $ Customer_id :$32.;
   drop dots;
   cards;
Session_id ............. Customer_id
1442103120308 ..... f8d63284bc0b463a93c588fef719bee0
1442103120308 ..... 0
1442103120308 ..... 0
1442103120308 ..... 0
1442103120308 ..... 0
1442103120308 ..... 0
1442103120308 ..... 0
1442103202937 ..... 4f13e0aebdda4811834285efe9543446
1442103202937 ..... 4f13e0aebdda4811834285efe9543446
1442103202937 ..... 4f13e0aebdda4811834285efe9543446
1442103202937 ..... 4f13e0aebdda4811834285efe9543446
1442103202937 ..... 4f13e0aebdda4811834285efe9543446
1442103202937 ..... 0
1442103202937 ..... 0
1442103202937 ..... 0
1442103202937 ..... 0
1442103202937 ..... 0
1442103202937 ..... 0
1424466798849 ..... 0
1424466798849 ..... 0
1424466798849 ..... 0
;;;;
   run;

data want;
set session(rename=customer_id=old_customer_id);
by session_id notsorted;
retain customer_id;
if first.session_id then customer_id=old_customer_id;
run;

答案 1 :(得分:0)

这是无限循环,除非恰好只有一个session_id观察。

if first.session_id then do until(last.session_id);
customer_id=first.customer_id;
end;

DOW在DO UNTIL内部有一个SET(最后一个;结束;代码块。

如果您展示一些样本数据,我会更容易提供帮助。

first.customer_id也是布尔值,而不是customer_id的值。

答案 2 :(得分:0)

这就是我如何使用DOW为LOCF做的。

修复了省略的BY语句和添加的调用缺失。

data session;
   infile cards firstobs=2;
   input session_id :$13. dots $ Customer_id :$32.;
   drop dots;
   cards;
Session_id ............. Customer_id
1442103120308 ..... f8d63284bc0b463a93c588fef719bee0
1442103120308 ..... 0
1442103120308 ..... 0
1442103120308 ..... 0
1442103120308 ..... 0
1442103120308 ..... 0
1442103120308 ..... 0
1442103202937 ..... 4f13e0aebdda4811834285efe9543446
1442103202937 ..... 4f13e0aebdda4811834285efe9543446
1442103202937 ..... 4f13e0aebdda4811834285efe9543446
1442103202937 ..... 4f13e0aebdda4811834285efe9543446
1442103202937 ..... 4f13e0aebdda4811834285efe9543446
1442103202937 ..... 0
1442103202937 ..... 0
1442103202937 ..... 0
1442103202937 ..... 0
1442103202937 ..... 0
1442103202937 ..... 0
1424466798849 ..... 0
1424466798849 ..... 0
1424466798849 ..... 0
;;;;
   run;
proc print;
   run;
data locf;
   if 0 then set session;
   do until(last.session_id);
      set session(rename=(Customer_id=xcust));
      by session_id notsorted;
      if xcust ne '0' then Customer_id = xcust;
      output;
      end;
   call missing(of Customer_id);
   drop xcust;
   run;
proc print;
   run;