0

私は整理しようとして立ち往生している問題があります...私は基本的にこのような少し見えるテーブルを持っています..

ID    user    operation     date
1     Jon     In         01/01/2013
1     Paul    Out        02/01/2013
1     Paul    In         03/01/2013
2     Jon     Deleted    04/01/2013
2     Paul    In         05/01/2013
2     Jon     Out        06/01/2013
1     Jon     out        07/01/2013
1     Jon     Deleted    08/01/2013
2     Jon     out        09/01/2013 
1     Jon     in         11/01/2013

したがって、基本的に、同じIDのJonとPaulの両方が「In」である場所を見つける必要があります。したがって、JonとPaulの例では、両方ともID 1に含まれており、ID2の場合はPaulのみが見つかります。したがって、その行の最後の既知の日付は、アーリーイン、アウト、または削除として含める必要があります。後で変更されたため、無視されます。つまり、INが存在し、後で「out」または「Thanks」に設定されていないID値を見つける必要があります。

4

2 に答える 2

1

データを正しく並べ替える場合は、最初に使用します。データステップで機能するはずです(同じ日に複数のエントリを持つIDとユーザーがいない限り、その場合はどちらを選択するかを決定する必要があります)。

data have;
input ID user $ operation $ date :mmddyy10.;
format date mmddyy10.;
cards;
1     Jon     In         01/01/2013
1     Paul    Out        02/01/2013
1     Paul    In         03/01/2013
2     Jon     Deleted    04/01/2013
2     Paul    In         05/01/2013
2     Jon     Out        06/01/2013
1     Jon     out        07/01/2013
1     Jon     Deleted    08/01/2013
2     Jon     out        09/01/2013 
1     Jon     in         11/01/2013
;
run;

proc sort data=have;
by id user descending date;
run;

data want;
set have;
by id user;
if first.user and lowcase(operation)='in' then output;
run;
于 2013-01-28T12:28:20.313 に答える
0

次のコードは、特定の質問とデータに対するアドホックです。コードを一般化して任意の数のユーザーに対して機能するようにするには、マクロ ロジックを使用して不可能ではありませんが、多少複雑になります。

proc sort data=original_dataset;
   by date id user operation;
run;

data results_dataset;
   set original_dataset;
   retain _jon _paul 0;
   drop _jon _paul;
   if trim(left(lowcase(operation))) eq 'deleted' then delete;
   else if trim(left(lowcase(operation))) eq 'in' then do;
      if trim(left(lowcase(user))) eq 'jon' then _jon = 1;
      else if trim(left(lowcase(user))) eq 'paul' then _paul = 1;
   end;
   else if trim(left(lowcase(operation))) eq 'out' then do;
      if trim(left(lowcase(user))) eq 'jon' then _jon = 0;
      else if trim(left(lowcase(user))) eq 'paul' then _paul = 0;
   end;
   if (_jon eq 1) and (_paul eq 1) then output;
run;
于 2013-01-28T17:45:17.703 に答える