【问题标题】:How to create SAS data set extracting observations with unique keys如何创建 SAS 数据集以使用唯一键提取观察值
【发布时间】:2015-03-19 17:37:24
【问题描述】:

我有一个由 100 多个变量组成的 sas 数据集。变量pid - 字符变量和year - 数字变量标识数据集中的观察值。

如何创建一个由具有唯一 pidyear 组合的观察组成的新数据集。也就是说,如果给定的pidyear 组合出现不止一次,我想删除所有相关的观察,而不仅仅是重复的。

【问题讨论】:

    标签: sql sas


    【解决方案1】:

    我不使用太多数据步骤。我使用 proc sql,对我来说很容易。

    proc sql;
        create table new_dataset as
        select * from old_dataset as a
          join
        (select pid, year, count(1) from old_dataset group by pid, year having count(1)<2)
        as b on a.pid=b.pid and a.year=b.year;
    run;
    

    内部查询只获取一次的 pid 和 year。由于having count(1)&lt;2,不会考虑任何多次出现的pid 和year。通过重新加入 pid 和 year,我只能从原始数据中获得这些观察结果。这实际上不需要排序。

    如有任何问题,请告诉我。

    【讨论】:

    • 虽然您没有明确编码排序步骤,但 SQL 可能会在后台执行排序(除非它可以在哈希表中完全在内存中执行连接,但您无法控制如何它将执行连接)。
    【解决方案2】:

    在数据步骤中简单地使用first.last. 就可以做到这一点。如果数据尚未按 pid 和年份排序,请运行 proc sort

    proc sort data=have;
    by pid year;
    run;
    
    data want;
    set have;
    by pid year;
    if first.year and last.year then output; /* only keep unique rows */
    run;
    

    【讨论】:

    • 这没有回答问题 - 提问者想要删除所有包含 pid 和 year 组合且不止一次出现的行,而不仅仅是重复项。
    • @user667489 我相信会的。如果记录为 first.year AND last.year 它不会有任何重复。
    • @user667489 这是在 SAS 中执行此操作的黄金标准方法(无论如何在 UNIQUEOUT 之前)。
    【解决方案3】:

    在 proc sort 中使用 UNIQUEOUT 和 NOUNIQUEKEY 选项来获得单步解决方案。

    data class;
    set sashelp.class;
    run;
    
    proc sort data=class nouniquekey uniqueout=unique_data;
    by sex age;
    run;
    

    http://support.sas.com/documentation/cdl/en/proc/65145/HTML/default/viewer.htm#p0qh2iuz3fa6rpn1eib1gaxr0sb5.htm

    【讨论】:

      【解决方案4】:

      您可以生成包含多次出现的 pid 和 year 组合的数据集,然后将其与其余部分合并以删除匹配项:

      proc sort data = have nodupkey dupout = duplicates;
          by pid year;
      run;
      
      data want;
          merge have 
                duplicates(in = a keep = pid year);
          by pid year;
          if not(a);
      run;
      

      【讨论】:

      • 从 SAS 9.3+ 开始还有 UNIQUEOUT 选项
      • @Reeza 这听起来像是一个答案:)
      猜你喜欢
      • 2013-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-02
      • 2014-08-06
      • 1970-01-01
      相关资源
      最近更新 更多