這裏有一個滾動總和的變體。沒有一個簡單的解決方案(特別是你毫無疑問有一些併發症未提及);但是這裏有幾點提示。
首先,您可能需要更改數據的格式。這實際上是一個相對容易解決的問題,如果每個可能的時間點都有一行,而不是一行。
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;
你可以輸出PROC意味着一個數據集,讓你的最大值加上平均值,然後要麼把那回主數據集或任何你需要的。
這是一個非常大的數據集,所以如果你正在查看數十萬個數據點,這可能不是你最好的選擇。
您也可以在沒有額外行的情況下在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和向量。與陣列解決方案類似,但具有更強大的操作技術。
來源
2013-03-30 06:08:01
Joe
你介意格式化你的問題,使它更具可讀性嗎? – JustinJDavies