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 在哪里“在”。因此,在关于 Jon 和 Paul 的示例中,ID 为 1,而 ID 为 2,我只会找到 Paul。因此,该行的最后一个已知日期必须包含在早期输入、输出或删除中,因为它后来被更改而被忽略。所以简而言之,我需要找到存在 IN 并且后来没有设置为“out”的 ID 值或提前致谢!

4

2 回答 2

1

如果您对数据进行正确排序,则首先使用。在数据步骤中应该可以工作(除非您的 id 和用户在同一天有超过 1 个条目,否则您需要确定在这种情况下使用哪一个)。

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 回答