這是我的一個早期問題的後續。 Transposing Comma-delimited fieldSAS Transpose逗號分隔字段
我爲特定情況工作的答案,但現在我有一個更大的數據集,因此在datalines語句中讀取它不是一個選項。我有類似於此過程中創建一個數據集:
data MAIN;
input ID STATUS STATE $;
cards;
123 7 AL,NC,SC,NY
456 6 AL,NC
789 7 ALL
;
run;
有兩個問題在這裏: 1:我需要在狀態的每個狀態的單獨行列 2:注意第三個觀察說'所有'。我需要用一個特定狀態列表替換它,我可以從一個單獨的數據集(下面)中獲取這些狀態。
data STATES;
input STATE $;
cards;
AL
NC
SC
NY
TX
;
run;
所以,這是我嘗試的過程似乎並沒有工作。 首先,我創建了插補所需的狀態列表,以及所述狀態的計數。
proc sql;
select distinct STATE into :all_states separated by ','
from STATES;
select count(distinct STATE) into :count_states
from STATES;
quit;
其次,我試圖推定列表中'ALL'值出現在STATE的列表。這是第一個錯誤出現的地方。我怎樣才能確保變量STATE足夠長的新值?另外,我如何處理逗號?
data x_MAIN;
set MAIN;
if STATE='ALL' then STATE="&all_states.";
run;
最後,我用SCAN函數一次讀取一個狀態。我也在這裏得到一個錯誤,但我認爲修復上述部分可能會解決它。
data x_MAIN_mod;
set x_MAIN;
array state(&count_states.) state:;
do i=1 to dim(state);
state(i) = scan(STATE,i,',');
end;
run;
在此先感謝您的幫助!
謝謝DomPazz。這並不能完全解決長度問題,因爲ID 789缺少SC,TX。有沒有辦法強制數據語句將整個宏讀入x_main? – pyll 2015-02-06 12:54:05
重新定義狀態的長度。 'data x_main;格式STATE $ <大數字here>; set main; ... run;'通常當你看到截斷時,這是因爲變量的長度不夠高。 – DomPazz 2015-02-06 14:45:39
如果它們處於STATE狀態,而不是OUT_STATE狀態,請嘗試'out_state = trim(scan(...));'刪除空白區域。 – DomPazz 2015-02-06 14:47:32