【问题标题】:copy observation of one variable down from first until last of another variable将一个变量的观察值从另一个变量的第一个复制到最后一个
【发布时间】:2015-09-15 16:59:53
【问题描述】:

好的,所以我有一个客户 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 ...... 客户 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,因此仅使用保留语句是行不通的。

因为我不擅长格式化这些点,所以它们只是为了将两列分开。

【问题讨论】:

  • 据我了解,您不需要循环,您需要保留。如果这不正确,请发布一些示例数据以帮助澄清您的问题。
  • @Reeza 发送的链接中的retain 语句不起作用,因为在某些情况下永远不会有customer_id(即只有0),在这种情况下,以前的customer_id 会保留到新会话。我需要 customer_id 由 session_id 确定,包括它们都是 0 的情况。

标签: sas


【解决方案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;

【讨论】:

    【解决方案2】:

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

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

    DOW 在 DO UNTIL(LAST.; END; 代码块内有 SET。

    如果您显示一些示例数据,我会更容易提供帮助。

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

    【讨论】:

    • 我在原始评论中添加了一个示例。谢谢!
    【解决方案3】:

    对于 LOCF,我可以使用 DOW 来做到这一点。

    修复省略的 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;
    

    【讨论】:

    • 这工作和不工作。我应该包含在我展示的原始数据集中,在某些情况下,附加到会话 ID 的客户 ID 全为 0。在这种情况下,您编写的代码会保留最后一个已知的客户 ID,并将其全部设为 0。我现在在原始问题的数据集中包含了几个 0 的观察值。
    • 现在应该好了。我省略了所有重要的 BY 语句,我们还需要 CUSTOMER_ID 的 CALL MISSING 因为我从会话中复制了 IF 0 然后设置...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    • 1970-01-01
    • 2019-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多