2014-07-14 47 views
1

我有一個數據集,其廣義上來說看起來像這樣計算列:SAS企業:通過比較值

╔════════╦══════════╦══════════╗ 
║ 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 ║ 
╚════════╩══════════╩══════════╩═══════╝ 

我usying SAS Enterprise Guide中,但不知道怎麼排1的值比較行2的值,我基本上什麼試圖做的是創建一個看起來像這樣的表達式:我不知道這甚至有可能在SAS企業

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

。我對此完全陌生,在Excel中我不會遇到這樣的問題。 Excel只能處理1700萬行數據。提前致謝!

回答

2

您需要在這裏使用last.函數。這可以作爲數據進行適當分類作爲長(例如下面這將需要由TICKER,日期和時間進行排序)

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

(如果沒有,那麼你需要做一個PROC排序然而從樣本數據您發佈它已經)

編輯:感謝@Joe

+2

它需要''在白天時間''更有可能。然後你可以做'dummy = last.time;'並直接得到你的0/1。 – Joe

+0

這看起來很棒。我已閱讀過最後一篇。功能,但我無法得到它的工作。我的數據是根據股票一天的時間自動排序的,但我會盡量在明天計算這個第一件事!你們太棒了。 –

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;