如何解决创建一个变量来逐步计算 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 举报,一经查实,本站将立刻删除。