2017-02-14 3 views
0

Ich habe drei Spalten in meinem Datensatz: ID, Date1 und Date2. Ich muss die Spalte Date1 nach Date2 ausfüllen. Mit anderen Worten, wenn Date1 älter ist als Date2, dann ist Date1 der gleiche Wert.Füllen Sie Daten nach einem anderen Datum mit sas

Meine ursprünglichen Daten:

ID |Date1  | Date2 
84 |   |13JAN2015 
84 |12NOV2014 |05FEB2015 
84 |12NOV2014 |07FEB2015 
106 |   |13JAN2015 
106 |09MAY2014 |05FEB2015 
106 |09MAY2014 |07FEB2015 
106 |09MAY2014 |09MAR2015 
153 |16JAN2015 |08OCT2015 
153 |16JAN2015 |12NOV2015 
155 |   |13JAN2015 
155 |01JUN2014 |05FEB2015 
155 |25APR2015 |12NOV2015 
155 |25APR2015 |28NOV2015 

Und ich möchte dieses Ergebnis erhalten:

ID |Date1  | Date2 
84 |12NOV2014 |13JAN2015 
84 |12NOV2014 |05FEB2015 
84 |12NOV2014 |07FEB2015 
106 |09MAY2014 |13JAN2015 
106 |09MAY2014 |05FEB2015 
106 |09MAY2014 |07FEB2015 
106 |09MAY2014 |09MAR2015 
153 |16JAN2015 |08OCT2015 
153 |16JAN2015 |12NOV2015 
155 |01JUN2014 |13JAN2015 
155 |01JUN2014 |05FEB2015 
155 |25APR2015 |12NOV2015 
155 |25APR2015 |28NOV2015 

Date1 Unter der Annahme, das Geburtsdatum und Date2 ist die Sammlung Informationen Datum, dann werden alle Informationen, die war gesammelt nach der Geburt (für die gleiche ID) muss zum selben Geburtsdatum gehören, so füllen Sie die Lücken.

Ich habe versucht, eine IF Anweisung zu verwenden, aber es hat nicht funktioniert. Jemand könnte mir helfen?

+0

Wie erhalten Sie Form 'Date1 =" "' zu 'Date1 =" 12/nov/14 "' für den ersten Datensatz? Es gibt etwas, was du nicht erzählst oder das Beispiel ist falsch. (Es würde auch helfen, wenn Sie Ihre Daten in einem Datastep fest codierten.) –

+0

Angenommen, Date1 ist das Geburtsdatum und Date2 ist das Sammlungsinformationsdatum, dann müssen alle Informationen, die nach der Geburt gesammelt wurden (für die gleiche ID), zu demselben gehören Geburtsdatum und füllt so die Lücken aus. – Mayara

+0

Haben Sie den Namen des Datumsformats, das Sie hier verwenden? –

Antwort

0

Sie könnten die Funktion lag() verwenden, mit der Sie den Wert des vorherigen Datensatzes in der Datenschrittschleife lesen können.

data have; 
    infile datalines delimiter='|'; 
    length Date1$10 Date2$10; 
    input ID Date1 $ Date2 $; 
    datalines; 
84 |   |13JAN2015 
84 |12NOV2014 |05FEB2015 
84 |12NOV2014 |07FEB2015 
106 |   |13JAN2015 
106 |09MAY2014 |05FEB2015 
106 |09MAY2014 |07FEB2015 
106 |09MAY2014 |09MAR2015 
153 |16JAN2015 |08OCT2015 
153 |16JAN2015 |12NOV2015 
155 |   |13JAN2015 
155 |01JUN2014 |05FEB2015 
155 |25APR2015 |12NOV2015 
155 |25APR2015 |28NOV2015 
; 
run; 

*** convert to dates; 
data have; 
    set have; 
    format d2 d1 Date9.; 
    *Date1 = COMPRESS(tranwrd(Date1,'/',''),,'s'); 
    d1 = input(Date1,Date9.); 
    *Date2 = COMPRESS(tranwrd(Date2,'/',''),,'s'); 
    d2 = input(Date2,Date9.); 
    rename d1=Date1 d2=Date2; 
    drop Date1 Date2; 
    run; 

*** sort; 
proc sort data=have out=want; 
    by id descending Date2; 
    run;quit; 

*** if missing then fill in previous value; 
data want; 
    set want; 
    lagDate1=lag(Date1); 
    if Date1=. then Date1=lagDate1; 
    drop lagDate1; 
    run; 

*** sort back to normal; 
proc sort data=want; 
    by id Date2; 
    run;quit; 
  1. sortieren die Daten
  2. wenn fehlt dann den vorherigen Wert
  3. Art wieder normal
  4. kopieren

Sie können eine Regel hinzufügen möchten, um sicherzustellen, dass ID das ist Wie zuvor, bevor das Datum kopiert wurde.

Verwandte Themen