gpt4 book ai didi

sas - 在不满足条件的情况下按 ID 删除所有观察结果

转载 作者:行者123 更新时间:2023-12-04 14:44:22 30 4
gpt4 key购买 nike

我有一个包含约 400 万笔交易记录的数据集,按 Customer_No 分组(每个 Customer_No 包含 1 笔或多笔交易,用顺序计数器表示)。每笔交易都有一个类型代码,我只对使用特定交易类型组合的客户感兴趣。加入表本身或在 Proc Sql 中使用 EXISTS 都不允许我有效地评估事务类型标准。我怀疑使用保留和 do 循环的数据步骤会更快地处理数据集

数据集:

Customer_No Tran_Seq    Tran_Type
0001 1 05
0001 2 12
0002 1 07
0002 2 86
0002 3 04
0003 1 07
0003 2 84
0003 3 84
0003 4 84

我尝试应用的标准:

  1. 所有 Customer_No 的 Tran_Type 只能在 ('04','05','07','84','86'),如果使用任何其他 Tran_Type,则删除该 Customer_No 的所有交易

  2. Customer_No 的 Tran_Type 必须包括('84' 或 '86')和 '04',如果不满足此条件,则删除 Customer_No 的所有交易

我想要的输出:

Customer_No Tran_Seq    Tran_Type
0002 1 07
0002 2 86
0002 3 04

最佳答案

如果数据已排序,DoW 循环解决方案应该是最有效的。如果它没有排序,它要么是最有效的,要么在规模上相似但效率略低,具体取决于数据集的情况。

我将 Dom 的解决方案与 3e7 ID 数据集进行了比较,并为 DoW 获得了相似(略少)的总长度,未排序数据集的 CPU 更少,排序数据集的速度提高了大约 50%。它保证在大约数据集写出所需的时间长度内运行(可能多一点,但不应该太多),如果需要加上排序时间。

data want;
do _n_=1 by 1 until (last.customer_no);
set have;
by customer_no;
if tran_type in ('84','86')
then has_8486 = 1;
else if tran_type in ('04')
then has_04 = 1;
else if not (tran_type in ('04','05','07','84','86'))
then has_other = 1;
end;
do _n_= 1 by 1 until (last.customer_no);
set have;
by customer_no;
if has_8486 and has_04 and not has_other then output;
end;
run;

关于sas - 在不满足条件的情况下按 ID 删除所有观察结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29044766/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com