2011-12-29 154 views
1

我有以下问题:重新排序列在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  B   B  B+  A 
BOB  3  D   C  C   . 
... 

的日期是随机的日期,他们是没有顺序的。

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

为您的信息:

我的数据原本是这样的:

CALENDAR1:

NAME CLASS CALENDaRDATE GPA 
JOHN 1  1/1/11  C- 
JOHN 1  8/1/11  C+ 
... 

而且我用这个PROC创建我的表:

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

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

待办事项你有关于如何按日期排序我的列的想法?

+0

迁移到SO,因为这是关于Stats的主题。 – whuber 2011-12-29 13:40:06

回答

5

这是供您参考不那么优雅的解决方案(有些是从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; 
+1

尼斯..我试着用PROC SQL的东西,因为你得到设置的VAR顺序创建的数据集,但忘记了RETAIN语句。在企业指南中,VALIDVARNAME的默认(至少在我的商店中)选项是ANY ...所以PROC TRANSPOSE不会在日期值中自动替换“_”作为“/”。一旦我设置VALIDVARNAME = v7,它对我有用。好的解决方案+1 – 2011-12-30 02:51:43

+0

@ carolinaJay65 +1对你来说,我在sASEG上工作,并使用ValidVarname = v7完美工作! – 2011-12-30 09:05:06

+0

@Robbie Liu非常感谢,如果您有时间可以提供一些详细信息(或链接),以帮助我了解保留声明在这种特定情况下的行为。 – 2011-12-30 09:06:14

1

在SORT和TRANSPOSE过程之前,尝试将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 ; 
+0

它不起作用,如果你用这个替换了最后3行(带有bob):'BOB 3 10/25/11 D',你会看到日历中的第一个日期是2011年10月25日。你的例子工作,因为在排序表中日历日期“到达”在正确的顺序。 1/1然后5/1然后8/1(然后1/1)(然后8/1),然后(10/25) – 2011-12-29 17:38:39