sas - SAS我如何创建一个计数器来减少变量更改规则
问题描述
我在尝试根据客户提供给我的其他变量的规则来减少计数变量时遇到问题。
目前,我有“HAVE”列,但想实现“WANT”
我们知道此 ID 更改了 5 个唯一日期,并忽略同一天的重复值 - 这将显示我随着时间的推移有 5 个唯一值更改。
这是一个例子,HAVE 是我的尝试,其中 WANT 是期望的结果(我认为)。
DATA HAVE;
LENGTH
ID 8 DATE_OF_VALUE $10 VALUE 8 HAVE 8 WANT 8 ;
FORMAT
ID 9. DATE_OF_VALUE $10. VALUE 5. HAVE 1. WANT 1. ;
INFORMAT
ID 9. DATE_OF_VALUE $10. VALUE 5. HAVE 1. WANT 1. ;
INFILE DATALINES4
DLM=','
MISSOVER
DSD ;
INPUT
ID : 9. DATE_OF_VALUE : $10. VALUE: 5. HAVE: 1.WANT : 1. ;
DATALINES4;
109999999,05/12/2017,42376,1,5
109999999,05/12/2017,42376,2,.
109999999,13/12/2017,42521,1,4
109999999,13/12/2017,42521,2,.
109999999,19/03/2018,43395,1,3
109999999,19/03/2018,43395,2,.
109999999,19/03/2018,43395,3,.
109999999,19/03/2018,43395,4,.
109999999,04/06/2018,43953,1,2
109999999,04/06/2018,43953,2,.
109999999,17/09/2018,44899,1,1
109999999,17/09/2018,44899,2,.
109999998,21/04/2018,4788,1,2
109999998,21/04/2018,4788,2,.
109999998,01/06/2018,4788,3,.
109999998,01/06/2018,4788,4,.
109999998,23/09/2018,4718,1,1
109999998,23/09/2018,4718,2,.
109999997,09/07/2018,8717,1,2
109999997,09/07/2018,8717,2,.
109999997,01/09/2018,8750,1,1
109999997,01/09/2018,8750,2,.
109999995,15/02/2018,22868,1,2
109999995,15/02/2018,22868,2,.
109999995,07/09/2018,22631,1,1
109999995,07/09/2018,22631,2,.
109554995,05/12/2017,92376,1,5
109554995,05/12/2017,92376,2,.
109554995,13/12/2017,92521,1,4
109554995,13/12/2017,92521,2,.
109554995,19/03/2018,93395,1,3
109554995,19/03/2018,93395,2,.
109554995,19/03/2018,93395,3,.
109554995,19/03/2018,93395,4,.
109554995,04/06/2018,93953,1,2
109554995,04/06/2018,93953,2,.
109554995,11/07/2018,94953,1,1
;;;;
解决方案
解决此问题的一种方法是使用所谓的双 DOW 循环。
您读取 ID 组中的数据两次。您将在代码中看到两个 do 循环。第一个读取 ID 组中的记录以计算唯一日期的数量。第二个然后重新读取相同的记录,并用递减的计数器输出它的记录。
请注意,在我的 HAVE 中,我将您的 date_of_value 变量作为数字日期变量读取,以便对其进行排序。如果要将其保留为字符,则可以添加 proc 排序步骤。
data want ;
*Count the number of distinct for an ID group;
do until (last.id) ;
set have (keep=ID Date_Of_Value Value rename=(Date_Of_value=Date));
by descending id date ;
if first.date then _DateCount=sum(_DateCount,1) ;
end ;
*Re-read the records for the ID group, decrementing the counter and outputting ;
do until(last.id) ;
set have (keep=ID Date_Of_Value Value rename=(Date_Of_value=Date));
by descending id date ;
if first.id then Want=_DateCount ;
else if first.date then Want=Want-1 ;
output ;
end ;
run ;
这会在购买组中给出重复的 WANT 值,这与您的 WANT 不同,在 WANT 之后在重复日期有缺失值:
ID Date VALUE Wan
109999999 21158 42376 5
109999999 21158 42376 5
109999999 21166 42521 4
109999999 21166 42521 4
109999999 21262 43395 3
109999999 21262 43395 3
109999999 21262 43395 3
109999999 21262 43395 3
109999999 21339 43953 2
109999999 21339 43953 2
109999999 21444 44899 1
109999999 21444 44899 1
109999998 21295 4788 3
109999998 21295 4788 3
109999998 21336 4788 2
109999998 21336 4788 2
109999998 21450 4718 1
109999998 21450 4718 1
109999997 21374 8717 2
109999997 21374 8717 2
109999997 21428 8750 1
109999997 21428 8750 1
109999995 21230 22868 2
109999995 21230 22868 2
109999995 21434 22631 1
109999995 21434 22631 1
109554995 21158 92376 5
109554995 21158 92376 5
109554995 21166 92521 4
109554995 21166 92521 4
109554995 21262 93395 3
109554995 21262 93395 3
109554995 21262 93395 3
109554995 21262 93395 3
109554995 21339 93953 2
109554995 21339 93953 2
109554995 21376 94953 1
我倾向于不喜欢缺失值,但如果需要,您可以自由更新它以创建缺失值。:)
推荐阅读
- c# - 在使用 IoC 的单例类中不断更改属性的最佳设计?
- asp.net - 与 UserManage 不同的用户 ID
- excel - 在 VBA 中使用 SQL 时返回 Null 的值不是 Null
- javascript - 使用制表符 selectRow 方法以编程方式选择一行
- mongodb - 如何恢复已删除的文档 mongodb 3.6 单节点?
- if-statement - If Else 语句的时间复杂度
- html - 行高元素内的 inline-block 元素
- spring-boot - 使用外部化用户凭证连接 IBM MQ 的问题 - Spring Boot + JMS + IBM MQ 8.0.0.9
- java - Gradlew 守护程序无法保留足够的堆空间,但 RAM 足够空
- javascript - Scraping - 使用非恒定数据清理刮擦