2016-08-25 283 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;