1

我有一个数据集,大致看起来像这样:

╔════════╦══════════╦══════════╗
║ 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 万行数据。提前致谢!

4

2 回答 2

2

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

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

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

编辑:谢谢@Joe

于 2014-07-14T16:03:09.343 回答
0

这是一种相当粗略的处理方式,但它确实有效......我不是 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;
于 2014-07-14T16:24:48.093 回答