2014-01-18 56 views
1

假設我有一個超市的數據集,其中包含產品類別,價格產品名稱等。我想按類別排序,但是按照定義的順序排序,而不是按字母順序排序。如何按sas中的已定義順序排序,而不是按字母順序排序?

例如,如果這些類別是:罐裝,乳製品,肉類,蔬菜,我想在它們可能到期時進行排序(我可能會有這些信息,所以請一起玩)。這意味着我想按此順序排序:乳製品,肉類,蔬菜,罐頭。

我寫了一個宏觀與此簽名:

key_sort(ds=, keys='canned, dairy, meat, vegetable', field =category, sort_by=) 

這解析鍵,以便可以在宏循環放,然後我用那麼多回路寫出來的select語句,像這樣:

Select(&field.) ; 
    %do i=1 %to &number_of_keys. ; 
    %let current_key= %scan(&keys., &I., &delim.) ; 
    When(&current_key.) &field._key=&i. ; 
    %end; 
End; 

然後我排序的&field._key
這是採取的最佳方法是什麼?這可以更簡潔或有效地完成嗎?

+1

這聽起來像是一種合理的方法。基本上,你需要輸入一個數值來定義你感興趣的類別的相對順序。然後按照這個數字值而不是類別進行排序。 – 2014-01-18 11:16:46

+0

我想另一種選擇是合併該數字號碼。 – Pureferret

+0

@Pureferret我的SAS有點生疏,我沒有安裝SAS系統來測試...... Anwyay ... proc格式沒問題,但我相信proc排序不會考慮排序的格式化值...所以,實際上,你可以使用'format'作爲迷你查找時間,並使用sql和臨時變量對格式化的值進行排序... –

回答

4

如果您有一個單獨的數據集包含排序,那麼您可以利用它並將其作爲輸入提供一個PROC FORMAT,或者儘可能簡單地應用一個只有幾位的數據集。

proc format; 
    value $EXPIRES 
     'canned'= 4 
     'dairy' = 1 
     'meat' = 2 
     'vegetable' = 3 
     other = 5 
     ; 
run; 

proc sql; 
    CREATE TABLE output_set AS 
    SELECT * FROM foods ORDER BY put(produce_type, $expires.); 
quit;