我想創建一個順序索引變量。例如,我有位點中是唯一的位點和部分: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
我已經使用第一次嘗試。最後。函數與循環,我只是無法弄清楚。無論如何,我對循環不太好。謝謝你的幫助!
我想創建一個順序索引變量。例如,我有位點中是唯一的位點和部分: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
我已經使用第一次嘗試。最後。函數與循環,我只是無法弄清楚。無論如何,我對循環不太好。謝謝你的幫助!
我不知道如何用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;
你的解決方案是完全合理的,特別是如果你不能確定是否有唯一的站點段的唯一值。如果你確信它們是唯一的(所以,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循環或類似的東西)。
如果我可以評論風格 - 你可以做的一件簡單的事情,使你的代碼更健壯,更可讀的是添加RUN語句到你的每一個步驟。雖然它們實際上並不是必需的,但在每個DATA和PROC步驟後都運行RUN(通常在QUIT中結束的那些除外,如PROC SQL)通常是一個好習慣。使其更易讀(因爲它更清楚一步到底和下一步開始的位置),並且更易於維護(例如,如果您只需測試一個步驟)。 – Joe