我目前有一些采用日期格式的数据,但基础信息实际上仍然是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 :(得分: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;
答案 1 :(得分: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;