我遇到以下问题:
我有一张看起来像这样的表:
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 :(得分: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 :(得分: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 ;