前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SAS数据集中重复记录问题

SAS数据集中重复记录问题

作者头像
专业余码农
发布2020-07-16 09:50:54
1.9K0
发布2020-07-16 09:50:54
举报
文章被收录于专栏:老Z的博客老Z的博客

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

  1. PROC SORT,其中有两个选项NODUPKEY、NODUPRECS(NODUP),第一个是按照BY变量来去重,第二是比较整条记录来去重,重复的记录可以用DUPOUT=来保留。程序如下:
代码语言:javascript
复制
proc sort data=sashelp.class out=unq nodupkey dupout=dup;
    by WEIGHT;
run;
  1. HASH,程序如下:
代码语言:javascript
复制
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步,程序如下:
代码语言:javascript
复制
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,程序如下:
代码语言:javascript
复制
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+)如下:
代码语言:javascript
复制
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行数都是最多的,但是这种方法在去重之前不用排序,故当处理的数据集较大时建议使用此方法以提高效率。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015-12-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档