专栏首页老Z的博客SAS数据集中重复记录问题

SAS数据集中重复记录问题

SAS程序猿/媛在处理数据的时候,经常会遇到要处理有关重复记录的问题,其中有些重复记录是我们需要的,而有的则是多余的。如果是多余的直接去重:

  1. PROC SORT,其中有两个选项NODUPKEY、NODUPRECS(NODUP),第一个是按照BY变量来去重,第二是比较整条记录来去重,重复的记录可以用DUPOUT=来保留。程序如下:
proc sort data=sashelp.class out=unq nodupkey dupout=dup;
    by WEIGHT;
run;
  1. HASH,程序如下:
data _null_;
    if 0 then set sashelp.class;
    if _n_=1 then do;
        declare hash h(dataset: 'sashelp.class', ordered: 'y');
        h.definekey('WEIGHT');
        h.definedata(all:'y');
        h.definedone();
    end;
    h.output(dataset: 'uni');
    stop;
run;

如果重复记录是需要保留以备后用则可以用下面几种方法:

  1. DATA步,程序如下:
proc sort data=sashelp.class out=class;
    by WEIGHT;
run;

data uni dup;
    set class;
    by WEIGHT;
    if first.WEIGHT and last.WEIGHT then output uni;
    else output dup;
run;
  1. PROC SQL,程序如下:
proc sql;
    create table uni as
        select * 
        from sashelp.class
        group by WEIGHT
        having count(*) = 1
        ;

    create table dup as
        select * 
        from sashelp.class
        group by WEIGHT
        having count(*) > 1
        ;
quit;
  1. HASH,程序(SAS9.2+)如下:
data uni(drop=rc: i);
    if _n_=1 then do;
        if 0 then set sashelp.class;
        dcl hash h1(dataset: 'sashelp.class', multidata:'y');
        h1.definekey('WEIGHT');
        h1.definedata(all: 'yes');
        h1.definedone();

        dcl hash h2(dataset: 'sashelp.class');
        dcl hiter hi('h2');
        h2.definekey('WEIGHT');
        h2.definedone();
    end;
    rc1=hi.first();
    do while(rc1=0);
        rc2= h1.find();
        i=0;
        do while(rc2=0 and i < 2);
            i+1;
            rc2=h1.find_next();
        end;
        if i < 2 then do;
            output;
            if i < 2 then h1.remove();
        end;
        rc1=hi.next();
    end;
    h1.output(dataset: 'dup');
run;

不管是去重还是保留重复的记录,上面几种方法中HASH行数都是最多的,但是这种方法在去重之前不用排序,故当处理的数据集较大时建议使用此方法以提高效率。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • SAS获取某目录下某种类型文件最后修改时间

    今天介绍一下用FILENAME PIPE来获取某一目录下某种类型文件的最后修改时间。比如要获取程序所在目录下SAS数据集的最后修改时间,代码如下:

    专业余码农
  • 一个关于Define.xml的奇怪问题

    今天一个同事和我说,她在做Define.xml时碰到一个奇怪的问题:最后要生成Define.xml的数据集中已经去除了各种特殊字符,但是生成的Define.xm...

    专业余码农
  • 一道小学生的趣味数学题

    据说上图(来源于网络)中这道小学生趣味题只要聪明一点的小学生都可以解出来,成年人估计只要一分钟。我也试着用SAS来解答, 思路如下:首先获取所有的数字出现的位置...

    专业余码农
  • 快速学会Springboot中编写Mock单元测试

    软件测试是一个应用软件质量的保证。java开发者开发接口往往忽视接口单元测试。作为java开发如果会Mock单元测试,那么你的bug量将会大大降低。spring...

    码农小胖哥
  • 利用反射比较两个对象字段值是否相等

    import java.lang.reflect.Field;import java.lang.reflect.Method;import java.util....

    java达人
  • 软件测试方法课程笔记(3)

    逻辑覆盖是通过对程序逻辑结构的遍历实现程序的覆盖. 是以程序内部的逻辑结构为基础的测试用例设计方法. 白盒测试作为逻辑测试方法,是以程序内部逻辑驱动的单元测...

    Mezereon
  • Objc 对象的今生今世

    在面向对象编程中,我们每天都在创建对象,用对象描述着整个世界,然而对象是如何从孕育到销毁的呢?

    一缕殇流化隐半边冰霜
  • 海量用户-高并发SAAS产品测试上线流程

    海量用户高并发SAAS产品测试上线流程 SAAS产品测试上线流程-以Web插件产品为例子 1   概述 在互联网产品中,IT公司之间更加注重产品功能之间的协作,...

    用户1170933
  • 从源码看 Jetpack(6)-ViewModel源码详解

    在两个多月前我开始写 从源码看 Jetpack 系列文章,从源码角度介绍 Jetpack 多个组件实现原理,写了一半就停笔去写 Java 多线程编程 的文章去了...

    叶志陈
  • 给你一份长长长的 Spring Boot 知识清单(下)

    过去,事件监听机制多用于图形界面编程,比如:点击按钮、在文本框输入内容等操作被称为事件,而当事件触发时,应用程序作出一定的响应则表示应用监听了这个事件,而在服务...

    芋道源码

扫码关注云+社区

领取腾讯云代金券