2012-07-18 94 views
0

如果您使用proc概要和class-clause,它將按照這個順序排序您的觀察結果。SAS:proc摘要和proc排序

proc summary data=One; 
    by var_1; 
    class var_2 var_3 var_4; 
    output out = Two(drop= _freq_ _type_); 
run; 

1)我是對嗎?

2)如果我沒有指定所有字段,會發生什麼?

proc summary data = Three(keep= var_1 var_2 var_ 3 var_4 var_5 var_6); 
    by var_1; 
    class var_2 var_3; 
    output out = Four(drop= _freq_ _type_); 
run; 

3)PROC更快:proc summaryproc sort

回答

5

這裏有幾件事要注意。

  • 爲了保留相同數量的行,您需要在proc摘要語句中指定nway選項。沒有它,你會得到每一個1,2和3類變量的組合。
  • 我不知道你爲什麼有BY語句(這顯然表明數據已經被該變量排序)。您可以輕鬆地在CLASS語句中包含var_1。
  • Proc Summary將按照BY變量的順序對輸出進行排序,然後按照它們指定的順序對CLASS變量進行排序。
  • 無論保留哪些變量,該邏輯都適用。
  • 在這個簡單的實例中,Proc Sort應該工作得更快,因爲Proc Summary將執行不需要的進一步計算。
  • 我有時使用Proc Summary在一個步驟中對數據進行排序和重複數據刪除(使用maxid函數),例如,我每天有多個身份證件,而且我只想採用最新的身份證件。這樣可以節省必須對數據進行排序,然後提取每個ID每天的最後一條記錄。

希望這有助於。

這是我最後一點的例子。使用_all_要求返回數據集中的所有變量,這確實會在日誌中爲以前在CLASS語句中列出的變量創建警告,但可以安全地忽略它。這基本上是我懶惰,不想爲寬數據集分別指定其餘變量。

data have; 
input unique_id custno log_dt :datetime15.; 
format log_dt datetime15.; 
cards; 
1 123 01jul2012:13:23 
2 265 01jul2012:13:56 
3 342 01jul2012:15:02 
4 123 01jul2012:17:12 
5 342 01jul2012:18:33 
6 265 02jul2012:08:41 
7 123 02jul2012:10:14 
8 265 02jul2012:11:05 
; 
run; 

proc summary data=have nway; 
class custno log_dt; 
format log_dt dtdate9.; 
output out=want (drop=_:) maxid(log_dt(_all_))=; 
run; 
+0

請問您可以添加一些示例嗎? – gaussblurinc 2012-07-18 13:11:14

+0

我同意以上2點。 1.爲了保留相同數量的行,您需要在proc彙總語句中指定nway選項。沒有它,你會得到每一個1,2和3類變量的組合。 2.類變量會自動用提到的變量對數據進行排序。 3.如果需要計算,則proc摘要是最好的使用程序,因爲它可以節省分揀時間(如果數據很大)。 – 2015-02-27 13:56:02