楼主: 凡尘梦1990
8519 4

sas如何输出所有重复key的观测,包括第一次出现的观测 [推广有奖]

  • 5关注
  • 2粉丝

讲师

46%

还不是VIP/贵宾

-

威望
0
论坛币
1 个
通用积分
3.0013
学术水平
5 点
热心指数
7 点
信用等级
0 点
经验
430 点
帖子
187
精华
0
在线时间
836 小时
注册时间
2012-10-9
最后登录
2024-2-1

10论坛币
我的问题,如标题所述。具体就是proc sort data=have nodupkey out=nodu dupout=dups; by key1 key2; run; 其中out=nodu输出的数据集中出现了duplicate key1 and key2,只保留了first.key1 or first.key2,而dupout=dups输出了除first.key1 or first.key2之外的其余duplicate key1 and key2. 但实际做数据时,需要弄清楚哪些key1和key2,出现了重复,以及对于重复key1 and key2的观测到底该如何取舍。所以我想要的是把所有出现key1 and key2重复的观测全部输出,包括第一次出现的第一条观测。如下数据,我希望输出的数据集是这样的,其中a和b分别是key1和key2.
我希望得到的结果;

a b c
4 4 4
4 4 5
4 5 6
4 5 .

原始数据创建;
data aa;
        input a b c;
        cards;
        2 2 3
        4 5 6
        4 4 4
        4 4 5
        4 5 .
        7 7 8
        9 5 5
        ;
run;

以下是我写的code及结果运行结果,都没有实现我想要的结果,求高手解答;
proc sort data=ex nodupkey out=nodu dupout=dups;
        by a b;
run;
proc sql;
        create table dupkeys as
        select d.*,e.*
        from nodu as d, dups as e
        where d.a=e.a and d.b=e.b;
quit;

结果:
a b c
4 4 4
4 5 6


或者data bb;
        merge nodu(in=x) dups(in=y);
        by a b;
        if x and y;
run;
结果:
a b c
4 4 5
4 5 .

拜托坛友解答,小弟不胜感激!



最佳答案

sas那个石家庄人 查看完整内容

把dup的数据集和原数据集做个left join就好 然后select里面的c选择原数据集的c
关键词:Key duplicate NODUPKEY proc sql Create title 如何
就这样吧。
  1. proc sql;
  2.         create table dupkeys as
  3.         select d.a,d.b,e.c
  4.         from dups as d
  5.         left join
  6.         aa as e
  7.         on d.a=e.a and d.b=e.b;
  8. quit;   
复制代码


把dup的数据集和原数据集做个left join就好 然后select里面的c选择原数据集的c

使用道具

藤椅
yongyitian 发表于 2015-10-5 09:28:04 |只看作者 |坛友微信交流群
  1. data aa;
  2. input a b c;
  3. cards;
  4. 2 2 3
  5. 4 5 6
  6. 4 4 4
  7. 4 4 5
  8. 4 5 .
  9. 7 7 8
  10. 9 5 5
  11. ;
  12. run;
  13. Proc sort data=aa out=aa_sort;
  14.    by a b;
  15. run;
  16. data want;
  17.     set aa_sort;
  18.     by a b;
  19.     if first.a + first.b + last.a + last.b < 4;
  20. run;
复制代码

使用道具

板凳
凡尘梦1990 学生认证  发表于 2015-10-5 14:29:47 |只看作者 |坛友微信交流群
谢谢以上两位坛友的热心回答,我忘了可以用left join。第一位坛友的回答具有普遍性,可以一直使用。。第二位坛友的回答具体问题具体分析,更加巧妙。

使用道具

报纸
微笑糖果 发表于 2018-7-1 19:20:41 |只看作者 |坛友微信交流群
我都是这样处理的。
data aa;
input a b c;
cards;
2 2 3
4 5 6
4 4 4
4 4 5
4 5 .
7 7 8
9 5 5
;
run;
Proc sort data=aa; by a b;run;
data want;
    set aa;  by a b;
    if first.b=last.b=1 then delete;
run;
已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
凡尘梦1990 + 2 + 1 + 2 + 1 精彩帖子

总评分: 论坛币 + 2  学术水平 + 1  热心指数 + 2  信用等级 + 1   查看全部评分

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-20 03:30