【问题标题】:Delete all observations, which are doubled on some variable删除所有观察值,这些观察值在某些变量上加倍
【发布时间】:2017-02-17 12:15:53
【问题描述】:

假设我有一张桌子:

Name Age
Bob  4
Pop  5
Yoy  6 
Bob  5

我想删除所有在表中不唯一的名称:

Name Age
Pop  5
Yoy  6 

ATM,我的解决方案是创建一个包含唯一名称计数的新表:

Name Count
Bob  2
Pop  1
Yoy  1 

然后,留下所有,这是Count > 1

我相信还有更漂亮的解决方案。

【问题讨论】:

    标签: sas


    【解决方案1】:

    如果我理解正确,有两种方法:

    SQL 过程

    在 SAS 中,您可能不需要像我在这里那样使用汇总函数,例如 MIN(),但是当只有一个 name 然后 min(age) = age 无论如何,以及将其迁移到另一个 RDBMS(例如 Oracle , SQL Server) 可能需要:

    proc sql;
      create table want as
      select name, min(age) as age
      from have
      group by name
      having count(*) = 1;
    quit;
    

    数据步骤

    需要对数据进行预排序:

    proc sort data=have out=have_stg;
      by name;
    run;
    

    在按组处理 SAS 数据时,首先。 (第一个点)和最后一个。生成(最后一个点)变量,表示当前观察是按组中的第一个和/或最后一个。使用 SAS 条件逻辑可以简单地测试if first.name = 1 and last.name = 1。使用逻辑简写来减少这个变成:

    data want;
      set have_stg;
      by name;
      if first.name and last.name;
      /* Equivalent to:*/
      *if first.name = 1 and last.name = 1;
    run;
    

    我在上面的代码中保留了两个版本,使用你觉得更易读的版本。

    【讨论】:

      【解决方案2】:

      您可以将proc sortnouniquekey 选项一起使用。然后使用uniqueout= 输出唯一值并使用out= 输出重复值(如果您不想覆盖原始数据集,则必须使用out= 语句)。

      proc sort data = have nouniquekey uniqueout = unique out = dups;
        by name;
      run;
      

      【讨论】:

        猜你喜欢
        • 2021-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多