我有一个广义的数据集,如下所示:
╔════════╦══════════╦══════════╗
║ 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万行数据。提前谢谢!
答案 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;