2016-08-25 6 views
0

В настоящее время у меня есть данные, которые находятся в формате даты, но основная информация на самом деле по-прежнему является номером даты SAS. Следовательно, когда я рассчитываю на это поле, я получаю отдельную строку для каждого из номеров SAS, и информация не группируется в месяц, как я хочу.Группировка даты SAS на месяц

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

data beforehave; 
    input ID $ Activity $ Origianl_Start_Date; 
    datalines; 
    12345 Activity1 Oct-13 
    12345 Activity1 Oct-13 
    12345 Activity1 Nov-16 
    12345 Activity2 Nov-16 
    12345 Activity2 Nov-16 
    23145 Activity1 Sep-15 
    23145 Activity2 Sep-15 
    23145 Activity2 Sep-15 
; 
RUN; 

Однако, когда речь идет о сосчитать перестановки на категории «Original_Start_Date» Я получаю это

data beforehave; 
    input ID $ Activity $ Origianl_Start_Date Count_of_Original_Start_Date; 
    datalines; 
    12345 Activity1 Oct-13 1 
    12345 Activity1 Oct-13 1 
    12345 Activity1 Nov-16 1 
    12345 Activity2 Nov-16 1 
    12345 Activity2 Nov-16 1 
    23145 Activity1 Sep-15 1 
    23145 Activity2 Sep-15 1 
    23145 Activity2 Sep-15 1 
; 
RUN; 

Однако то, что я хочу это.

data beforehave; 
    input ID $ Activity $ Origianl_Start_Date Count_of_Original_Start_Date; 
    datalines; 
    12345 Activity1 Oct-13 2 
    12345 Activity1 Nov-16 1 
    12345 Activity2 Nov-16 2 
    23145 Activity1 Sep-15 1 
    23145 Activity2 Sep-15 2 
; 
RUN; 

Я думал о принятии этого и превратить его в символьный формат, однако, было бы очень полезно, чтобы сохранить его в качестве даты.

Все, что я действительно хочу, это иметь возможность группировать номер даты SAS в зависимости от месяца.

+0

Как вы обобщив данные? такие процедуры, как 'freq' и' mean', будут автоматически группироваться по форматированным значениям, однако на шаге данных будет использоваться базовое значение (если вы не используете опцию 'groupformat' в' '' ''. – Longfish

ответ

2

Как указано в моем комментарии, вот 2 способа достижения вашей цели. Самый простой - proc summary, так как это автоматически группируется по форматированным значениям. Второй вариант - это шаг данных с опцией groupformat в операторе by, для этого требуется proc sort.

data have; 
    input ID $ Activity $10. Original_Start_Date :date7.; 
    format Original_Start_Date monyy5.; 
    datalines; 
    12345 Activity1 01Oct13 
    12345 Activity1 02Oct13 
    12345 Activity1 03Nov16 
    12345 Activity2 04Nov16 
    12345 Activity2 05Nov16 
    23145 Activity1 06Sep15 
    23145 Activity2 07Sep15 
    23145 Activity2 08Sep15 
; 
RUN; 

/* method 1 */ 
proc summary data=have nway; 
class id activity original_start_date; 
output out=want1 (drop=_type_ rename=(_freq_=Count_of_Original_Start_Date)); 
run; 

/* method 2 */ 
proc sort data=have; 
by id activity original_start_date; 
run; 

data want2; 
set have; 
by id activity original_start_date groupformat; 
if first.original_start_date then Count_of_Original_Start_Date=0; 
Count_of_Original_Start_Date+1; 
if last.original_start_date then output; 
run; 
0

Я предпочитаю использовать ргос SQL для этого:

data have; 
    input ID $ Activity $10. Original_Start_Date :date7.; 
    format Original_Start_Date monyy5.; 
    datalines; 
    12345 Activity1 01Oct13 
    12345 Activity1 02Oct13 
    12345 Activity1 03Nov16 
    12345 Activity2 04Nov16 
    12345 Activity2 05Nov16 
    23145 Activity1 06Sep15 
    23145 Activity2 07Sep15 
    23145 Activity2 08Sep15 
; 
Run; 

proc sql; 
    create table want as 
    select ID,Activity,Original_Start_Date,count(*) as Count_of_Original_Start_Date 
    from have 
    group by 1,2,3; 
quit; 
Смежные вопросы