我需要根据总计进行子集化并仅保留记录数。 因此:对于ABC,只保留两行(因为Total=2),并保留Count=1和2的记录(无论是否缺失)。所以count=3不会被选中。
对于LMN,只保留3条记录(因为Total=3),并保留Count=1和2和3的记录(无论是否缺失)。所以count=4不会被选中。
输出应该是这样的:
我尝试使用数组,如果那么,做循环。但真的很乱,我没有功能代码。
以下是数据内容:
ID 总计数时间
ABC 2 1 。
ABC 2 2 00:00
ABC 2 3 。
LMN 3 1 02:25
LMN 3 4 。
LMN 3 3 04:45
LMN 3 2 07:45
请帮忙,谢谢!
首先让我们将您的列表转换为实际的数据集。
data have;
input ID $ Total Count Time :time. @@;
format time tod5.;
cards;
ABC 2 1 . ABC 2 2 00:00 ABC 2 3 . LMN 3 1 02:25
LMN 3 4 . LMN 3 3 04:45 LMN 3 2 07:45
;
您只需计算每个 BY 组看到的观察数量即可。您可以保留一个计数器变量。但更简单的方法是将 SET 语句嵌套在 DO 循环中以保持计数。如果您使用自动变量 _N_ 作为计数器,则无需删除该变量。
data want;
do _n_=1 by 1 until(last.id);
set have;
by id;
if _n_ <= total then output;
end;
run;
结果
Obs ID Total Count Time
1 ABC 2 1 .
2 ABC 2 2 00:00
3 LMN 3 1 02:25
4 LMN 3 4 .
5 LMN 3 3 04:45