2013-03-30 76 views
0

對不起,這篇文章的「不真實的信息」標題。 我有以下數據SAS設置:SAS:向後看的數據步驟來計算平均值

time Add time_delete 
5 3.00 5 
5 3.15 11 
5 3.11 11 
8 4.21 8 
8 3.42 8 
8 4.20 11 
11 3.12 . 

time對應於新添加的(Add)價格在每3分鐘拍賣。此價格可以在相同的時間間隔或更晚的時間內刪除,如time_delete所示。我的目標是計算每timeAdd字段的平均價格。例如,我在time=5的平均價格是(3.15+3.11)/2,因爲3.00在間隔內被刪除。那麼站在time=8的平均價格是(4.20+3.15+3.11)/3。正如你所看到的,我必須看看我現在站在的位置,然後回頭看看哪些價格仍然有效,站在time=8。此外,我想有一個領域,我知道每個time可用的最高價格沒有被刪除。 有什麼幫助嗎?

+0

你介意格式化你的問題,使它更具可讀性嗎? – JustinJDavies

回答

2

這裏有一個滾動總和的變體。沒有一個簡單的解決方案(特別是你毫無疑問有一些併發症未提及);但是這裏有幾點提示。

首先,您可能需要更改數據的格式。這實際上是一個相對容易解決的問題,如果每個可能的時間點都有一行,而不是一行。

data have; 
input time Add time_delete; 
datalines; 
5 3.00 5 
5 3.15 11 
5 3.11 11 
8 4.21 8 
8 3.42 8 
8 4.20 11 
11 3.12 . 
;;;; 
run; 

data want; 
set have; 
if time=time_delete then delete; 
else do time=time to time_delete-1; 
    output; 
end; 
keep time add; 
run; 

proc means data=want mean max n; 
class time; 
var add; 
run; 

你可以輸出PR​​OC意味着一個數據集,讓你的最大值加上平均值,然後要麼把那回主數據集或任何你需要的。

這是一個非常大的數據集,所以如果你正在查看數十萬個數據點,這可能不是你最好的選擇。

您也可以在沒有額外行的情況下在SQL中執行此操作,儘管這些「其他複雜情況」可能會導致事情發生扳機。

proc sql; 
select H.time, mean(V.add), max(V.add) from (
    select distinct H.time from have H 
    left join 
    (select * from have) V 
    on V.time le H.time 
    and V.time_delete gt H.time) 
    group by 1; 
; 
quit; 

相當簡單快速的查詢,除非如果您有很多時間值,則可能需要一些時間才能執行連接。

其他選擇:

  • 將數據讀入陣列,其中第二陣列跟蹤刪除點。這可能會變得有點複雜,因爲您可能需要通過刪除點對數組進行排序 - 所以不必在最後添加新記錄,而需要將一堆記錄向下移動。 SAS不像c語言那樣友好。

  • 使用散列表解決方案。比數組混亂一些,特別是你可以比兩個單獨的數組更容易地排序哈希表。

  • 使用IML和向量。與陣列解決方案類似,但具有更強大的操作技術。

+0

感謝您的幫助!但是對於第二個代碼的第二部分,我收到以下消息:「DO循環控制信息無效,INITIAL或TO表達式丟失或BY表達式丟失,爲零或無效。」任何建議? – Plug4

+0

要麼你錯誤輸入了某些東西,要麼你運行的東西不太符合SAS​​(WPS/etc)。這個例子在我的機器上運行良好,沒有任何關於DO循環的特定版本。 – Joe

+0

但是,儘管出現錯誤消息,我仍然可以獲得所需的輸出! – Plug4