这是我的一个早期问题的后续。 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