переупорядочение столбца в SAS - PullRequest
1 голос
/ 29 декабря 2011

У меня возникает следующая проблема:

У меня есть таблица, которая выглядит следующим образом:

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.Я посмотрел некоторые вещи в Google, но для этой конкретной проблемы ничего нет, так как у меня 300 дат и, следовательно, 300 имен столбцов.

Для вас:

Мои данные изначально выглядели так:

calendar1:

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 ; 

У вас есть идея, как отсортировать мои столбцы по датам

Ответы [ 2 ]

5 голосов
/ 30 декабря 2011

Это не очень элегантное решение для вашей справки (некоторые заимствованы из материалов 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 голос
/ 29 декабря 2011

Попробуйте преобразовать CALENDARDATE в дату SAS до процедур SORT и TRANSPOSE. Вы можете выполнить преобразование даты при импорте данных.

Этот код, кажется, делает то, что вы хотите ... (но это небольшой пример)

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 ; 
...