【问题标题】:SAS Enterprise: Compute column by comparing valuesSAS Enterprise:通过比较值计算列
【发布时间】:2014-07-14 15:42:44
【问题描述】:

我有一个数据集,大致如下:

╔════════╦══════════╦══════════╗
║ TICKER ║   DAY    ║   TIME   ║
╠════════╬══════════╬══════════╣
║ AET    ║ 20100104 ║ 09:30:04 ║
║ AET    ║ 20100104 ║ 09:30:04 ║
║ AET    ║ 20100104 ║ 09:30:04 ║
║ AET    ║ 20100104 ║ 09:30:05 ║
║ AET    ║ 20100104 ║ 09:30:05 ║
║ AET    ║ 20100104 ║ 09:30:06 ║
║ AET    ║ 20100104 ║ 09:30:06 ║
║ AET    ║ 20100104 ║ 09:30:06 ║
╚════════╩══════════╩══════════╝

我想要添加一个额外的列,如果它不是该时间的最后一次观察,则表示值 0,如果它是该时间的最后一次观察,则表示 1。因此我想添加以下列:

╔════════╦══════════╦══════════╦═══════╗
║ TICKER ║   DAY    ║   TIME   ║ dummy ║
╠════════╬══════════╬══════════╬═══════╣
║ AET    ║ 20100104 ║ 09:30:04 ║     0 ║
║ AET    ║ 20100104 ║ 09:30:04 ║     0 ║
║ AET    ║ 20100104 ║ 09:30:04 ║     1 ║
║ AET    ║ 20100104 ║ 09:30:05 ║     0 ║
║ AET    ║ 20100104 ║ 09:30:05 ║     1 ║
║ AET    ║ 20100104 ║ 09:30:06 ║     0 ║
║ AET    ║ 20100104 ║ 09:30:06 ║     0 ║
║ AET    ║ 20100104 ║ 09:30:06 ║     1 ║
╚════════╩══════════╩══════════╩═══════╝

我正在使用 SAS Enterprise Guide,但不知道如何比较第 1 行的值和第 2 行的值。我基本上想要做的是创建一个如下所示的表达式:

IF TIME = TIME(row+1)
THEN 0
ELSE 1

我不知道这在 SAS 企业中是否可行。我对此完全陌生,我在 Excel 中做这样的事情没有问题。 Excel 不能很好地处理 1700 万行数据。提前致谢!

【问题讨论】:

    标签: sas enterprise-guide


    【解决方案1】:

    您需要在这里使用last. 函数。只要对数据进行了适当的排序(例如下面需要按 TICKER、DAY 和 TIME 排序),就可以使用此方法

    data new;
      set original;
      by TICKER DAY TIME;
      if last.TIME then dummy = '1';
    run;
    

    (如果不是,那么您将需要进行 proc 排序,但是从您发布的示例数据来看,它已经是)

    编辑:谢谢@Joe

    【讨论】:

    • 很可能需要by ticker day time;。然后你可以dummy=last.time; 直接得到你的 0/1。
    • 这看起来很棒。我已经读到了最后一个。功能,但我无法让它工作。我的数据是按股票交易日时间自动排序的,但我明天会尝试计算第一件事!你们太棒了。
    【解决方案2】:

    这是一种相当粗略的方法,但它确实有效......我不能 100% 确定是否有这个功能,但这是我很快想到的......

    //Create index of each obs.
    DATA DATE_TIME_TABLE;
    SET DATE_TIME_TABLE;
       COLUMN INDEX;
       INDEX=_N_;
       OUTPUT;
    RUN;
    
    //Sort by descending index for each time. Last obs of each time now is first.
    PROC SORT DATA=DATE_TIME;
    BY TIME DESCENDING INDEX;
    RUN;
    
    //The first obs = 1 everything else = 0
    DATA DATE_TIME_TABLE;
    SET DATE_TIME_TABLE;
       IF TIME <> LAG(TIME) THEN
          dummy = 1;
       ELSE dummy = 0;
       END;
    RUN;
    
    //Put the table back to how it was
    PROC SORT DATA=DATE_TIME_TABLE;
    BY INDEX;
    RUN;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-18
      • 1970-01-01
      相关资源
      最近更新 更多