2016-08-25 281 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'和'means'等程序會自動按格式化的值進行分組,但數據步驟將使用基礎值(除非在'by'語句中使用'groupformat'選項。 – Longfish

回答

2

正如我在評論中提到的,這裏有兩種方法來實現你的目標。最簡單的是proc summary,因爲這會按格式化的值自動分組。第二個選項是by聲明中的groupformat選項的數據步驟,這需要事先提供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

我更喜歡使用PROC 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;