我有一個非常大的表,其中包含索引日期時間字段。我想按月對數據集進行分組處理,只輸出每個月的最後一次觀察結果。通過SAS中的組處理
的問題是,它不包含一個月的場,所以我不能使用這樣的:
if last.month then do;
output;
end;
有沒有一種方法,我可以實現這種行爲,而不必每月新增在以前的datastep領域?該表是50 gig壓縮,所以我想避免任何不必要的步驟。
謝謝
我有一個非常大的表,其中包含索引日期時間字段。我想按月對數據集進行分組處理,只輸出每個月的最後一次觀察結果。通過SAS中的組處理
的問題是,它不包含一個月的場,所以我不能使用這樣的:
if last.month then do;
output;
end;
有沒有一種方法,我可以實現這種行爲,而不必每月新增在以前的datastep領域?該表是50 gig壓縮,所以我想避免任何不必要的步驟。
謝謝
實際上,您可以使用'通過groupformat'對原始數據集進行實現,將datetime字段格式化爲'dtmonyy5'。顧名思義,這是由格式化的值而不是原來的。
data new1;
set old;
format datetime dtmonyy5.;
by groupformat datetime;
if last.datetime;
run;
另一種方法是使用Proc Summary,儘管這可能是內存密集型的,尤其是對於大型數據集。這是代碼。
proc summary data=old nway;
class datetime;
format datetime dtmonyy5.;
output out=new2 (drop=_:) maxid(datetime(_all_))=;
run;
剛上以前的答案快速注意到,在「月」功能對工作日期字段,沒有日期時間,所以你需要的日期部分功能添加到該行。
month = month(datepart(datetime));
這是一個很好的使用數據視圖的情況。這允許您添加在處理數據集時即時創建的變量,而無需創建新的物理數據集。
data new/view=new;
set old;
month = month(datepart(datetime));
run;
如果你運行它,你會看到處理時間不到一秒,讓你知道它不會產生一個新的50 GB的數據集。但是你可以在你的代碼中使用數據視圖new
,就好像它是一個數據集。
嗨itzy - 是的,你是對的。你缺少的一件事是,我還需要在視圖中添加'by my_datetime'語句,以便下面的datastep按照月份'語句正確的順序排列月份。隨意更新您的答案與通過聲明=)謝謝。而且我可以證實,即使在這個觀點下,該指數也繼續使用。 –
有趣的方法。並感謝更正 - 我已經更新了我的答案。 – itzy
太棒了 - 我不知道你可以做到這一點!兩種解決方案都很好。我接受了Keith,因爲它具有無需創建視圖的優勢。如果我可以多次投兩個答案,我會... –
另外 - 如果你正在大型數據集上運行proc摘要,請嘗試將'/ groupinternal'開關添加到任何不需要按格式化值分組的類變量。我看到這樣做的性能提高了30%。你可以使用multipple'class'命令,這樣可以讓一些人使用開關,而其他人則不使用。 –