2016-08-25 5 views
0

Ich habe derzeit einige Daten in einem Datumsformat, aber die zugrunde liegende Information ist eigentlich immer noch eine SAS-Datumsnummer. Folglich, wenn ich auf dieses Feld zähle, bekomme ich eine separate Zeile für jede der SAS-Nummern und die Information ist nicht auf Monat gruppiert, wie ich es möchte.Gruppierung SAS-Datum am Monat

Die Daten, die ich habe, sieht so aus;

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; 

aber wenn es darum geht Kategorie Permutationen auf der ‚Original_Start_Date‘ zu zählen, die ich bekommen diese

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; 

jedoch, was ich will dies.

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; 

Ich hatte gedacht, um diese zu nehmen und es in ein Zeichenformat dreht aber es wäre wirklich nützlich sein, es als ein Datum zu halten.

Alles, was ich wirklich will, ist in der Lage, eine SAS-Datumsnummer basierend auf dem Monat zu gruppieren.

+0

Wie werden zusammenfassend die Daten? Prozeduren wie 'freq' und' means' gruppieren sich automatisch nach den formatierten Werten, ein Datenschritt verwendet jedoch den zugrunde liegenden Wert (es sei denn, Sie verwenden die 'groupformat'-Option in einer by-Anweisung. – Longfish

Antwort

2

Wie in meinem Kommentar angedeutet, hier sind 2 Möglichkeiten, um Ihr Ziel zu erreichen. Am einfachsten ist proc summary, da dies automatisch durch die formatierten Werte gruppiert wird. Die 2. Option ist ein Datenschritt mit der groupformat Option in der by Anweisung, dies erfordert eine proc sort vorher.

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

ich lieber mit proc sql hierfür:

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; 
Verwandte Themen