sas中的列重新排序

sas中的列重新排序,sas,Sas,我有以下问题: 我有一张这样的桌子: WEIGHT DATE 8/1/11 1/1/11 5/1/11 ... 10/25/11 NAME CLASS NICK 1 A . A . JOHN 1 c+ C- . B- JOHN 2 A . . . MIKE 2

我有以下问题:

我有一张这样的桌子:

WEIGHT    DATE  8/1/11    1/1/11   5/1/11 ... 10/25/11 
NAME   CLASS
NICK     1        A          .        A       .
JOHN     1       c+         C-        .        B-
JOHN     2        A          .        .        .
MIKE     2       B           B        B+        A
BOB      3       D           C        C         .
...
这些日期是随机的,并且没有顺序

我想在sas中订购我的日期和我的专栏。我在谷歌上查了一些东西,但这个问题并没有什么特别的,因为我有300个日期,所以有300个列名

供您参考:

我的数据原来是这样的:

日历1:

NAME CLASS CALENDaRDATE GPA
JOHN  1      1/1/11      C-
JOHN  1      8/1/11      C+
...
我用这个过程创建了我的表:

    proc sort data=calendar1;
        by  NAME ClASS CALENDARDATE;
    run;

    PROC TRANSPOSE DATA = calendar1 OUT = calendar2 ;
       BY nAME cLASS; 
       VAR GPA;
       ID CALeNdaRDATE; 
    RUN ; 

您知道如何按日期对我的列进行排序吗?

在排序和转置过程之前,尝试将CALENDARDATE转换为SAS日期。您可以在数据导入中进行日期转换

这段代码似乎做了你想要的…但它是一个小样本

data work.calendar1 (drop=dt);
 input name $ class $ dt $ gpa $;
 calendardate=mdy(scan(dt,1),scan(dt,2),scan(dt,3)); 
 format calendardate mmddyy10.;
datalines;
 JOHN  1      1/1/11      C-
 JOHN  1      8/1/11      C+
 JOHN  1      10/25/11    B-
 JOHN  2      8/1/11      A
 NICK  1      8/1/11      A
 NICK  1      5/1/11      A
 MIKE  2      8/1/11      B
 MIKE  2      1/1/11      B
 MIKE  2      5/1/11      B+
 MIKE  2      10/25/11    B
 BOB   3      8/1/11      D
 BOB   3      1/1/11      C
 BOB   3      5/1/11      C
 ;

proc sort data=work.calendar1;
 by  NAME ClASS CALENDARDATE;
run;

PROC TRANSPOSE DATA = calendar1 OUT = calendar2(drop=_name_) ;
 BY nAME cLASS; 
 VAR GPA;
 ID CALeNdaRDATE; 
RUN ; 

尝试在排序和转置过程之前将CALENDARDATE转换为SAS日期。您可以在数据导入中进行日期转换

这段代码似乎做了你想要的…但它是一个小样本

data work.calendar1 (drop=dt);
 input name $ class $ dt $ gpa $;
 calendardate=mdy(scan(dt,1),scan(dt,2),scan(dt,3)); 
 format calendardate mmddyy10.;
datalines;
 JOHN  1      1/1/11      C-
 JOHN  1      8/1/11      C+
 JOHN  1      10/25/11    B-
 JOHN  2      8/1/11      A
 NICK  1      8/1/11      A
 NICK  1      5/1/11      A
 MIKE  2      8/1/11      B
 MIKE  2      1/1/11      B
 MIKE  2      5/1/11      B+
 MIKE  2      10/25/11    B
 BOB   3      8/1/11      D
 BOB   3      1/1/11      C
 BOB   3      5/1/11      C
 ;

proc sort data=work.calendar1;
 by  NAME ClASS CALENDARDATE;
run;

PROC TRANSPOSE DATA = calendar1 OUT = calendar2(drop=_name_) ;
 BY nAME cLASS; 
 VAR GPA;
 ID CALeNdaRDATE; 
RUN ; 

这是一个不太优雅的解决方案供您参考,有些是从CarolinaJay65的输入中借用的。可以使用RETAIN语句对列重新排序

我认为您不能像'5/1/11'那样保留列名,因为SAS不允许在列名中使用/。而且第一个字符不能是数字

data work.calendar1 (drop=dt);
 input name $ class $ dt $ gpa $;
 calendardate=mdy(scan(dt,1),scan(dt,2),scan(dt,3)); 
  format calendardate mmddyy10.;
datalines;
 JOHN  1      1/1/11      C-
 JOHN  1      8/1/11      C+
 JOHN  1      10/25/11    B-
 JOHN  2      8/1/11      A
 NICK  1      8/1/11      A
 NICK  1      5/1/11      A
 MIKE  2      8/1/11      B
 MIKE  2      1/1/11      B
 MIKE  2      5/1/11      B+
 MIKE  2      10/25/11    B
 BOB   3      10/25/11     D
 BOB   3      1/1/11      C
 BOB   3      5/1/11      C
 ;

proc sort data=work.calendar1;
 by  NAME ClASS CALENDARDATE;
run;

PROC TRANSPOSE DATA = calendar1 OUT = calendar2(drop=_name_) ;
 BY nAME cLASS; 
 VAR GPA;
 ID CALeNdaRDATE; 
RUN ; 

proc sort data=calendar1(keep=CALENDARDATE) out=datecol nodupkey;
by CALENDARDATE;
run;

data datecol;
set datecol;
format col $11.;
col=cats('_',tranwrd(put(CALENDARDATE,mmddyy10.),'/','_'));
run;

proc sql;
select col into :x separated by ' ' from datecol;
quit;

data calendar2;
retain name class &x;
set calendar2;
run;

这是一个不太优雅的解决方案供您参考,有些是从CarolinaJay65的输入中借用的。可以使用RETAIN语句对列重新排序

我认为您不能像'5/1/11'那样保留列名,因为SAS不允许在列名中使用/。而且第一个字符不能是数字

data work.calendar1 (drop=dt);
 input name $ class $ dt $ gpa $;
 calendardate=mdy(scan(dt,1),scan(dt,2),scan(dt,3)); 
  format calendardate mmddyy10.;
datalines;
 JOHN  1      1/1/11      C-
 JOHN  1      8/1/11      C+
 JOHN  1      10/25/11    B-
 JOHN  2      8/1/11      A
 NICK  1      8/1/11      A
 NICK  1      5/1/11      A
 MIKE  2      8/1/11      B
 MIKE  2      1/1/11      B
 MIKE  2      5/1/11      B+
 MIKE  2      10/25/11    B
 BOB   3      10/25/11     D
 BOB   3      1/1/11      C
 BOB   3      5/1/11      C
 ;

proc sort data=work.calendar1;
 by  NAME ClASS CALENDARDATE;
run;

PROC TRANSPOSE DATA = calendar1 OUT = calendar2(drop=_name_) ;
 BY nAME cLASS; 
 VAR GPA;
 ID CALeNdaRDATE; 
RUN ; 

proc sort data=calendar1(keep=CALENDARDATE) out=datecol nodupkey;
by CALENDARDATE;
run;

data datecol;
set datecol;
format col $11.;
col=cats('_',tranwrd(put(CALENDARDATE,mmddyy10.),'/','_'));
run;

proc sql;
select col into :x separated by ' ' from datecol;
quit;

data calendar2;
retain name class &x;
set calendar2;
run;

迁移到SO是因为这在统计数据上是离题的。迁移到SO是因为这在统计数据上是离题的。这不起作用,如果用bob替换最后3行:“bob 3 10/25/11 D”,您将看到日历中的第一个日期将是2011年10月25日。您的示例之所以有效,是因为在已排序的表中,日历日期以正确的顺序到达。1/1、5/1、8/1、1/1、8/1、10/25这不起作用,如果你用bob替换最后三行:“bob 3 10/25/11 D”,你会看到日历中的第一个日期是2011年10月25日。您的示例之所以有效,是因为在已排序的表中,日历日期以正确的顺序到达。1/1,然后5/1,然后8/1,然后1/1,然后8/1,然后10/25Nice..我试着用PROC SQL做一些事情,因为您可以设置所创建数据集的变量顺序,但是忘记了RETAIN语句。在《企业指南》中,VALIDVARNAME的默认选项至少在我的店铺中是ANY…,因此PROC TRANSPOSE不会自动将日期值中的/替换为u。一旦我设置了VALIDVARNAME=v7,它就为我工作了。好办法+1@carolinaJay65+1对于您也是,我在sASEG上工作,使用ValidVarname=v7,它工作得非常完美@Robbie Liu非常感谢,如果您有时间,您可以提供一些详细信息或链接,以帮助我了解retain语句在这种特殊情况下的作用。@RickyBobby很乐意提供帮助。在这种情况下,RETAIN语句使用这些变量初始化新创建的数据集,但不使用任何值。然后,设置数据集将为这些变量赋值。变量的顺序将不会再次更改,因为它是预定义的。很好..我正在尝试使用PROC SQL,因为您可以设置所创建数据集的变量顺序,但忘记了RETAIN语句。在《企业指南》中,VALIDVARNAME的默认选项至少在我的店铺中是ANY…,因此PROC TRANSPOSE不会自动将日期值中的/替换为u。一旦我设置了VALIDVARNAME=v7,它就为我工作了。好办法+1@carolinaJay65+1对于您也是,我在sASEG上工作,使用ValidVarname=v7,它工作得非常完美@Robbie Liu非常感谢,如果您有时间,您可以提供一些详细信息或链接,以帮助我了解retain语句在这种特殊情况下的作用。@RickyBobby很乐意提供帮助。在这种情况下,RETAIN语句使用这些变量初始化新创建的数据集,但不使用任何值。然后,设置数据集将为这些变量赋值。变量的顺序将不再更改,因为它是预定义的。