2012-10-19 84 views
1

我想創建一個順序索引變量。例如,我有位點中是唯一的位點和部分:SAS:如何基於字符串變量創建索引變量?

站點1 1 2 2 3 3

部分A B A B A B

網站截面組合是唯一的。我想要一個唯一的順序索引變量,以便站點1的A部分= 1和站點1的B = 2部分以及站點2的部分A = 3,依此類推。

站點1 1 2 2 3 3

部分A B A B A B

指數1 2 3 4 5 6

我已經使用第一次嘗試。最後。函數與循環,我只是無法弄清楚。無論如何,我對循環不太好。謝謝你的幫助!

回答

0

我不知道如何用do循環做到這一點,但顯然它可以使用proc排序和數據合併來完成。創建僅保留用於創建索引的分類變量的數據集,然後使用noduprescs進行排序以刪除重複項。使用+1添加索引變量。然後合併回原始數據集。

data sitesections; 
set dataset; 
keep site section; 

proc sort data=sitesections out=sitesections2 noduprecs; 
by site section; 

data sitesections_final; 
set sitesections2; 
sectionindex +1; 

data final; 
merge sitesections_final dataset; 
by site section; 
run; 
+2

如果我可以評論風格 - 你可以做的一件簡單的事情,使你的代碼更健壯,更可讀的是添加RUN語句到你的每一個步驟。雖然它們實際上並不是必需的,但在每個DATA和PROC步驟後都運行RUN(通常在QUIT中結束的那些除外,如PROC SQL)通常是一個好習慣。使其更易讀(因爲它更清楚一步到底和下一步開始的位置),並且更易於維護(例如,如果您只需測試一個步驟)。 – Joe

1

你的解決方案是完全合理的,特別是如果你不能確定是否有唯一的站點段的唯一值。如果你確信它們是唯一的(所以,NODUPRECS不會刪除任何東西),然後可以將其簡化和刪除合併:如果你想讓他們在正確的順序

data final; 
set dataset; 
sectionIndex+1; 
run; 

的datastep之前可選的排序。

如果你想避免合併(如果該數據集是非常大的),而你不知道它們是唯一的,那麼你可以做:

proc sort data=dataset; 
by site section; 
run; 

data final; 
set dataset; 
by site section; 
if first.section then sectionIndex+1; 
run; 

這並不需要NODUPRECS或NODUPKEY,和節省一些處理時間。

我不認爲DO循環將是有益的,除非你正在做一些更復雜(需要一個DOW循環或類似的東西)。