2012-01-25 31 views
2

我有一個非常大的表,其中包含索引日期時間字段。我想按月對數據集進行分組處理,只輸出每個月的最後一次觀察結果。通過SAS中的組處理

的問題是,它不包含一個月的場,所以我不能使用這樣的:

if last.month then do; 
    output; 
end; 

有沒有一種方法,我可以實現這種行爲,而不必每月新增在以前的datastep領域?該表是50 gig壓縮,所以我想避免任何不必要的步驟。

謝謝

回答

7

實際上,您可以使用'通過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)); 
+0

有趣的方法。並感謝更正 - 我已經更新了我的答案。 – itzy

+0

太棒了 - 我不知道你可以做到這一點!兩種解決方案都很好。我接受了Keith,因爲它具有無需創建視圖的優勢。如果我可以多次投兩個答案,我會... –

+0

另外 - 如果你正在大型數據集上運行proc摘要,請嘗試將'/ groupinternal'開關添加到任何不需要按格式化值分組的類變量。我看到這樣做的性能提高了30%。你可以使用multipple'class'命令,這樣可以讓一些人使用開關,而其他人則不使用。 –

4

這是一個很好的使用數據視圖的情況。這允許您添加在處理數據集時即時創建的變量,而無需創建新的物理數據集。

data new/view=new; 
set old; 
month = month(datepart(datetime)); 
run; 

如果你運行它,你會看到處理時間不到一秒,讓你知道它不會產生一個新的50 GB的數據集。但是你可以在你的代碼中使用數據視圖new,就好像它是一個數據集。

+0

嗨itzy - 是的,你是對的。你缺少的一件事是,我還需要在視圖中添加'by my_datetime'語句,以便下面的datastep按照月份'語句正確的順序排列月份。隨意更新您的答案與通過聲明=)謝謝。而且我可以證實,即使在這個觀點下,該指數也繼續使用。 –