SAS-基于月份对数据集变量重新排序

SAS-基于月份对数据集变量重新排序,sas,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开头的列重新排序-- A、B、C前缀不需要按任何排序顺序排列(这意味着它们可以从任何东西开始),但我的要求是根据月份和年份对它们重新排序(这意味着2018年1月B日2018年2月C日可以)

我有一个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开头的列重新排序--

A、B、C前缀不需要按任何排序顺序排列(这意味着它们可以从任何东西开始),但我的要求是根据月份和年份对它们重新排序(这意味着2018年1月B日2018年2月C日可以)

在SAS中有没有实现这一点的方法

  • 更改数据结构,使您有一个较长的dat集,而不是 短数据集。(数据步骤)
  • 从日期部分中分离出前缀(数据步骤)
  • 按所需顺序排序(PROC Sort)
  • 转置到所需格式(PROC转置)

  • 如果您的数据与发布的数据完全相同,并且输出被完全转置,那么这也可以工作,但它完全依赖于源数据是否正确指定和排序

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

    如果你有少量变量,你可以使用
    retain Col1 Col2 Col3 A_Jan2018 B_Jan2018 C_Jan2018 A_Feb2018 B_Feb2018 C_Feb2018 A_Mar2018 B_Mar2018 C_Mar2018设置前。如果不是,那么你必须创建一些额外的帮助变量来实现这一点。这是一个问答网站,不是一个免费的代码编写服务。如果您尝试自己解决问题,并在遇到特定问题时发布可复制的代码示例,您将得到更好的响应。这是您的实际数据吗?或者,您是否试图传达数据当前在按日期排序的列和按变量(A、B、C)排序的行中,并且希望将其转换为按变量(A、B、C)排序的列和按日期排序的行?您是否有id变量来指示当前行代表的变量?你怎么知道某一列代表的日期?只是好奇-你使用
    %*
    注释格式而不是
    *,有什么特别的原因吗
    /**/
    ?不,这意味着我最近一直在写宏。
    %*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;
    
    proc transpose data=have out=want2;
         var col1-col3;
    run;