SAS - 根据月

时间:2018-02-19 14:18:19

标签: sas

我有一个SAS数据集,其列布局如下:

Col1      Col2      Col3 
A_jan2018 A_feb2018 A_mar2018 
B_jan2018 B_feb2018 B_mar2018 
C_jan2018 C_feb2018 C_mar2018

我需要以这种格式重新排序以A或B或C开头的列 -

Col1      Col2      Col3 
A_Jan2018 B_Jan2018 C_Jan2018 
A_Feb2018 B_Feb2018 C_Feb2018 
A_Mar2018 B_Mar2018 C_Mar2018

A,B,C前缀不需要处于任何排序顺序(意味着它们可以从任何东西开始),但我的要求是根据月份重新排序它们(意味着B_Jan2018 A_Feb2018 C_2018没问题)。

有没有办法在SAS中实现这一目标?

1 个答案:

答案 0 :(得分:0)

  1. 更改数据结构,以便您拥有长数据集而不是 一个简短的数据集。 (数据步骤)
  2. 从日期部分(数据步骤)
  3. 中分离出前缀
  4. 按所需订单排序(PROC SORT)
  5. 转置为所需格式(PROC TRANSPOSE)

    %*create sample data;
    data have;
        informat col1 col2 col3 $10.;
        input Col1  $    Col2  $    Col3 $;
        cards;
    A_jan2018 A_feb2018 A_mar2018 
    B_jan2018 B_feb2018 B_mar2018 
    C_jan2018 C_feb2018 C_mar2018
    ;
    run;
    
    %*Make it wide table;
    data _long;
        set have;
        array _col(3) col1-col3;
    
        do i=1 to 3;
            prefix=scan(_col(i), 1, "_");
            date=input(scan(_col(i), 2, "_"), anydtdte.);
            value=catx('_', prefix, put(date, monyy7.));
            output;
        end;
        format date date9.;
    run;
    
    %*Sort by desired output;
    proc sort data=_long;
        by date prefix;
    run;
    
    %* transpose to the desired format;
    proc transpose data=_long out=want1;
        by i;
        var value;
    run;
    
  6. 如果您的数据与发布完全相同且输出完全转置,那么这也可以工作,但它完全依赖于源数据的指定和正确排序。

    proc transpose data=have out=want2;
         var col1-col3;
    run;