【问题标题】:SAS : Eliminate duplicates if a condition is satisfiedSAS:如果满足条件,则消除重复项
【发布时间】:2014-10-28 13:56:26
【问题描述】:

我想根据标识符、顺序和条件从数据库中消除重复项。

更准确地说,我有几个观察数据。有时我有一个条件让我想保留那个观察结果(让我们修复它condition=1),但即使这个条件不成立,也要用相同的标识符保持观察结果(条件=0)。

但是,如果我对一个标识符有几个观察结果 condition=0,那么我想消除重复项,标准是具有最大 order

没有条件我可以这样做

proc sort data=have;
    by identifier descending order;
run;

proc sort nudopkey data=have;
    by identifier;
run;

但是如何将我的条件纳入其中?

编辑1:添加数据库示例:

data Test; 
   input identifier $ order condition; 
   datalines;
1023 1 0
1023 2 0
1064 2 0
1064 1 0
1098 1 0
1098 1 1
;          

那我想保留

  • 1023 2 0
  • 1064 2 0
  • 1098 1 0
  • 1098 1 1

编辑 2:试图精确我的条件

【问题讨论】:

    标签: duplicates sas


    【解决方案1】:

    我假设您只想在标识符的所有记录的条件设置为 0 时消除重复项。在这种情况下,您希望保留具有最大顺序的记录并消除具有相同标识符的所有其他记录。

    Proc sql; 
             create  table   want    as 
             select  * 
             from    test 
             group   by      identifier 
             having  max (condition) ne      0 
             or      order           eq      max (order) 
             ; 
    Quit; 
    

    这将保留最大条件 = 1 的标识符的所有行, 或者在最大条件 = 0 的情况下,选择具有最大顺序的行。

    这就是你想要的吗?

    【讨论】:

    • 非常感谢!确切地说,只要条件= 0,我想消除重复项,无论是否存在条件= 1的观察。但是可以通过更改条件 ne 0 中的条件来轻松地从您的示例中获得。
    • 其实我还有一个问题:你在have选项中的不同条件是按顺序读取和执行的吗?例如,如果我有两个订单变量,但想先检查一个,这更有效
    • 顺序无关。如果满足任一条件,则将记录写入输出表。这两个条件是独立的。
    • 您可以颠倒条件的顺序,但不会对结果输出表产生任何影响。
    • 回答你的第二个问题 - 你应该能够通过在你的Having子句中嵌入case语句来对不同的列施加一些处理条件的顺序。
    【解决方案2】:

    其中一些取决于您如何定义“条件”。您的情况是否可以在该标识符的每条记录上轻松验证?然后你可以做这样的事情。

    1. 评估条件。
    2. 对于为真的记录(您要删除重复项),设置 flag=0。对于不正确的记录,将条件标志加一。

    如果该 ID 中的所有记录的条件都为真,则所有记录都将具有相同的值 (flag=0),并且by identifier flag; 上的 nodupkey 将删除额外内容。如果所有记录的条件都为假,则不会删除这些记录。如果某些为真而某些为假,并且您只想删除具有该标识符的某些记录(仅删除为真的重复记录),那么您必须确保对其进行排序以具有所有条件= true 记录在顶部,或者有一个单独的标志计数器来确定标志的值(因为它有时会在中间变为 0,所以 0 0 0 1 2 3 0 4 5 6 是你想要的,而不是 0 0 0 1 2 3 0 0 1 2 )。

    也许更容易看到的是在数据步中进行。排序后by identifier descending order

    data want;
      set have;
      by identifier descending order;
      if (condition=true) and not (first.identifier) then delete;
    run;
    

    如果 condition=true 始终位于顶部,或者在一个 ID 组中始终保持一致,这将再次起作用。如果它不一致且混杂,那么您需要跟踪您是否保留了一个真实的记录(假设您想要),或者它可能会删除所有真实的记录;使用单独的变量来跟踪您保留了多少。 first.identifier 将仅针对该标识符的第一条记录为 1/TRUE,不考虑条件。您还可以创建标志,然后对by identifier flag descending order; 进行排序并保证条件=true 位于顶部(通过将flag=0 设置为true,或按descending flag 进行排序。)

    【讨论】:

    • 我编辑了我的问题以更准确。正如我理解您的回答一样,我的数据库的问题是该 ID 中的所有记录的条件都不成立。它只是向我表明我必须再观察一次。
    猜你喜欢
    • 2020-09-08
    • 2015-09-12
    • 2022-10-24
    • 2015-10-13
    • 2023-01-19
    • 2021-08-28
    • 2019-08-01
    • 2017-09-27
    • 2020-09-11
    相关资源
    最近更新 更多