好的,我有一个客户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语句将无效。
因为我对格式化点很糟糕,只是打破了两列。
答案 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;