微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

创建一个变量来逐步计算 ID 在一天内重复的次数

如何解决创建一个变量来逐步计算 ID 在一天内重复的次数

所以我有一个表,每天都有不同的日期和不同的时间,并且客户 ID 每天可以出现多次。

data Data1;
   infile datalines delimiter=',';
   input date :ddmmyy10. ID $ time :time8. $ ;
   format date ddmmyy10.;  
   format time time8.; 
datalines;
05/11/2020,1000,8:15:23
05/11/2020,8:20:10
05/11/2020,1001,8:21:10
05/11/2020,9:05:15
05/11/2020,10:30:20
06/11/2020,1002,8:26:10
06/11/2020,1003,8:27:10
06/11/2020,9:40:01
;

我想输出一个名为“尝试”的列,如下所示:

data Data1;
   infile datalines delimiter=',';
   input date :ddmmyy10. ID $ time :time8. $ Attempt;
   format date ddmmyy10.;  
   format time time8.; 
datalines;
05/11/2020,8:15:23,1
05/11/2020,8:20:10,2
05/11/2020,8:21:10,9:05:15,10:30:20,3
06/11/2020,8:26:10,1
06/11/2020,8:27:10,9:40:01,2
06/11/2020,10:20:10,11:20:10,12:20:10,13:20:10,3
;

如您所见,客户 1000 在 05/11 日出现了两次,在 06/11 日出现了 4 次,客户 1001 在 05/11 出现了 3 次,客户 1002 在 06/11 出现了一次,客户 1003 在 06/11 出现了 2 次次于 06/11。

我还希望 3 是最大值,因此如果客户一天出现超过 3 次(例如 06/11 的客户 1000),则值为 3。

我不介意使用 sas 语言或 proc sql,所以如果有人对此有任何想法,请告诉我

解决方法

只需使用 BY 组处理和保留变量。您可以使用 MIN() 函数将计数器上限设置为 3。

data Data1;
   infile datalines dsd;
   input date :ddmmyy. ID $ time :time. expect;
   format date ddmmyy10. time time8.; 
datalines;
05/11/2020,1000,8:15:23,1
05/11/2020,8:20:10,2
05/11/2020,1001,8:21:10,9:05:15,10:30:20,3
06/11/2020,10:20:10,1
06/11/2020,11:20:10,2
06/11/2020,12:20:10,13:20:10,1002,8:26:10,1003,8:27:10,9:40:01,2
;

data want;
  set data1;
  by date id ;
  retain attempt;
  if first.id then attempt=1;
  else attempt=min(3,attempt+1);
run;

注意:我对您的示例数据重新排序以避免需要添加 PROC SORT 步骤。如果您的真实数据集已分组但未排序,如您的示例所示,您可以在 BY 语句中添加 NOTSORTED 关键字,逻辑将起作用。

,

或者,您仍然可以考虑使用条件相关聚合查询 proc sql

data Data1;
   infile datalines delimiter=',';
   input date :ddmmyy10. ID $ time :time8. ;
   format date ddmmyy10.;  
   format time time8.; 
datalines;
05/11/2020,8:15:23
05/11/2020,8:20:10
05/11/2020,8:21:10
05/11/2020,9:05:15
05/11/2020,10:30:20
06/11/2020,8:26:10
06/11/2020,8:27:10
06/11/2020,9:40:01
06/11/2020,3
;

proc sql;
    CREATE TABLE output AS
    SELECT d.date,d.ID,d.time,(SELECT CASE 
                         WHEN COUNT(*) > 3 
                         THEN 3 
                         ELSE COUNT(*) 
                    END FROM Data1 sub
             WHERE sub.ID = d.ID
               AND sub.date = d.date
               AND sub.time <= d.time
            ) AS attempts
    FROM Data1 d; 
quit;   

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。