2

私のデータは現在、次の形式になっています。

 ID     Fill1          Fill2         Fill3         Fill4          Fill5     
 1      01JAN2014      28JAN2014     26FEB2014     .              .
 2      .              05FEB2012     03MAR2012     02APR2012      01MAY2012
 3      10MAR2015      08APR2015     07MAY2015     05JUN2015      03JUL2015
 4      .              .             20FEB2013     18MAR2013      .         

そして、IDごとに治療「エピソード」を作成しようとしています。つまり、ID ごとに、最初と最後の空でない約定を見つけて、2 つの日付の差を計算したいと考えています。たとえば、ID=1 の場合、01JAN2014 と 26FEB2014 の間の時差を見つける必要があります。あれは、

Fill1 - Fill3 = エピソードの長さ

しかし、ID=4 の場合は、見つける必要があります。

Fill3 - Fill4 = エピソードの長さ

ここで、episoduration は作成された新しい変数です。「最初」と「最後」の Fill 日付が異なる 30,000 を超える一意の ID があります。よろしくお願いします。

4

3 に答える 3

2
data have;
input Id Fill1 date9. Fill2 date9. Fill3 date9. Fill4 date9. Fill5 date9.;
format Fill1 -  Fill5 date9.;
cards;
1 01JAN201428JAN201426FEB2014 
2          05FEB201203MAR201202APR201201MAY2012
3 10MAR201508APR201507MAY201505JUN201503JUL2015
4                   20FEB201318MAR2013 
;
run;

data want;
set have;
    array fill {5};
    format first last date9.;

    do i = 1 to dim(fill);
       first=coalesce(first, fill(i));
       last=coalesce(fill(i), last);
    end;

    episodeduration = last - first;

    drop i;
run;

ステートメントを使用arrayして配列を作成し、変数とcoalesce()関数をループして、欠落していない最初/最後のものを見つけます。

コメント: このコードは、最初の変数から最後の変数に移動することで、最初/最後を見つけます。日付に関して最初/最後が必要な場合は、最小関数と最大関数が適しています: min(of fill1 -- fill5);- ループする必要はありません。

于 2015-09-22T19:15:04.880 に答える
1

vasja の SAS バージョンはかなり良さそうです。これを SQL 側で実行する方法を次に示します (これはほぼ同じ手順です)。

Select *, 
    DATEDIFF(day, 
         CONVERT(date,COALESCE(date1, date2, date3, date4, date5)),
         CONVERT(date, COALESCE(date5,date4,date3,date2,date1))
    )
from SomeTableNameAboutEpisodes;

基本的には、coalesce を使用して null 以外の最初の値を見つけ、それを日付に変換します。次に、2 つの日付の差をとります。ただし、これは、空のセルに値がなく (null)、空の行がない場合にのみ機能します。(ただし、単にISNULL(DATEDIF(...), 0)を置くこともできます)。

于 2015-09-22T19:50:25.320 に答える
0

降順の「SAS 変数リスト」(FILL5-FILL1) を使用して、これを少し簡単にすることができます。

data diff;
   set have;
   first = coalesce(of fill1-fill5);
   i     = whichn(first,of fill1-fill5);
   last  = coalesce(of fill5-fill1);
   j     = 6-whichn(last, of fill5-fill1);
   format first last date9.;
   run;

Obs    Id        Fill1        Fill2        Fill3        Fill4        Fill5        first    i         last    j

 1      1    01JAN2014    28JAN2014    26FEB2014            .            .    01JAN2014    1    26FEB2014    3
 2      2            .    05FEB2012    03MAR2012    02APR2012    01MAY2012    05FEB2012    2    01MAY2012    5
 3      3    10MAR2015    08APR2015    07MAY2015    05JUN2015    03JUL2015    10MAR2015    1    03JUL2015    5
 4      4            .            .    20FEB2013    18MAR2013            .    20FEB2013    3    18MAR2013    4
于 2015-09-23T13:31:26.997 に答える