SAS移调逗号分隔场(SAS Transpose Comma Separated Field)

2019-10-21 19:11发布

这是一个后续矿山的早期问题。 移调逗号分隔场

我得到的特定情况下工作,但现在我有一个更大的数据集,所以阅读它在datalines声明答案是不是一种选择。 我有类似于此过程中创建一个数据集:

data MAIN;
    input ID STATUS STATE $;
cards;
123 7 AL,NC,SC,NY
456 6 AL,NC
789 7 ALL
;
run;

这里有两个问题:1:我需要一个单独的排在该州第2列每个状态:注意观察第三次说“ALL”。 我需要更换与特定的国家,我可以从一个单独的数据集(下)获得的列表。

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”值出现状态。 这是出现的第一个错误的位置。 我怎样才能确保变量状态的新值足够长的时间? 此外,如何处理逗号?

data x_MAIN;
    set MAIN;
    if STATE='ALL' then STATE="&all_states.";
run;

最后,我用扫描功能在同一时间在一个国家阅读。 我也在这里得到一个错误,但我认为固定上述部分可以解决这个问题。

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;

先谢谢您的帮助!

Answer 1:

看起来你几乎没有。 试试这个,最后一个数据步骤。

data x_MAIN_mod;
    set x_MAIN;
    format out_state $2.;
    nstate = countw(state,",");
    do i=1 to nstate;
       out_state = scan(state,i,",");
       output;
    end; 
run;


Answer 2:

你必须真正有两个步骤,这样呢? 您可以在临时变量中使用“大数目”,并没有对事情太大的影响,如果没有中间数据集。

data x_MAIN;
    length state_temp $150;
    set MAIN;
    if STATE='ALL' then STATE_temp="&all_states.";
    else STATE_temp=STATE;
    array state(&count_states.) state:;
    do i=1 to dim(state);
        state(i) = scan(STATE,i,',');
    end; 
    drop STATE_temp;
run;

如果你确实需要的状态,那么老实说,我会与大号码走(= 50 * 3,所以不是所有大),然后添加OPTIONS COMPRESS=CHAR; 这将(给予或采取)把你的CHAR字段为VARCHAR (在CPU时间一点点的费用,但通常远远小于保存在磁盘读取/写入时间)。



文章来源: SAS Transpose Comma Separated Field
标签: sas