SAS Enterprise:通过比较值来计算列

时间:2014-07-14 15:42:45

标签: sas enterprise-guide

我有一个广义的数据集,如下所示:

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

2 个答案:

答案 0 :(得分:2)

您需要在此处使用last.功能。只要数据被适当地排序(例如下面需要按照TICKER,DAY和TIME排序),就可以使用它。

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

(如果不是那么你将需要进行proc排序,但是从你发布的样本数据来看已经是这样了)

编辑:谢谢@Joe

答案 1 :(得分:0)

这是一种相当粗略的方式来实现它,但它确实有效......我不能100%确定是否有这个功能,但这是我想出来的...... < / p>

//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;