请选择 进入手机版 | 继续访问电脑版
楼主: Rock2000
1295 2

[有偿编程] 怎样取得一组数据最大值并列出该组某变量值与最大值不符的组所有记录 [推广有奖]

  • 1关注
  • 24粉丝

学术权威

22%

还不是VIP/贵宾

-

威望
1
论坛币
104811 个
通用积分
25.5412
学术水平
55 点
热心指数
74 点
信用等级
48 点
经验
23619 点
帖子
547
精华
0
在线时间
10767 小时
注册时间
2004-5-27
最后登录
2024-3-29

Rock2000 发表于 2018-12-18 12:52:13 |显示全部楼层 |坛友微信交流群
50论坛币
怎样取得一组数据最大值并列出该组某变量值与最大值不符的组所有记录,数据如下
要求
1.MAX_SUBID的值是相同ID(相同组)中SUBID的最大值,比如ID=2组SUBID最大值为3,则该组每条记录的MAX_SUBID填入3;
2.如果该组中有某一A1与MAX_SUBID不符,把该组数据归到某数据集中,比如这里ID=2及ID=4中就有A1与MAX_SUBID不符的,需把这些记录归到新数据集B中。
  1. ID  A1 SUBID
  2. 1   1  1
  3. 2   2  1
  4. 2   3  2
  5. 2   3  3
  6. 3   2  1
  7. 3   2  2
  8. 4   4  1
  9. 4   3  2
  10. 4   4  3
  11. 4   2  4
  12. 5   1  1
  13. 6   2  2
  14. 6   2  2
复制代码

希望最终数据集B如下
  1. ID  A1 SUBID MAX_SUBID
  2. 2   2   1       3
  3. 2   3   2       3
  4. 2   3   3       3
  5. 4   4   1       4
  6. 4   3   2       4
  7. 4   4   3       4
  8. 4   2   4       4
复制代码



最佳答案

l1i2n3i4n5g 查看完整内容

根据你的描述出来的结果和数据集B有出入! data test; input ID A1 SUBID; cards; 1 1 1 2 2 1 2 3 2 2 3 3 3 2 1 3 2 2 4 4 1 4 3 2 4 4 3 4 2 4 5 1 1 6 2 2 6 2 2 ; run; proc sql; create table test_MAX_SUBID as select id, max(SUBID) as MAX_SUBID from test group by id; quit; proc sql; create table test_left_join as s ...
关键词:数据集中 最大值 数据集 组数据 变量值
l1i2n3i4n5g 在职认证  发表于 2018-12-18 12:52:14 |显示全部楼层 |坛友微信交流群
根据你的描述出来的结果和数据集B有出入!
data test;
   input ID A1 SUBID;
cards;
1   1  1
2   2  1
2   3  2
2   3  3
3   2  1
3   2  2
4   4  1
4   3  2
4   4  3
4   2  4
5   1  1
6   2  2
6   2  2
;
run;

proc sql;
   create table test_MAX_SUBID as
   select id, max(SUBID) as MAX_SUBID
   from test
   group by id;
quit;

proc sql;
   create table test_left_join as
   select * from test left join test_MAX_SUBID
   on test.id=test_MAX_SUBID.id;
run;

data b;
   set test_left_join;
   if A1^=MAX_SUBID;
run;
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
Rock2000 + 1 + 5 + 1 精彩帖子

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

使用道具

Rock2000 发表于 2018-12-18 19:21:25 |显示全部楼层 |坛友微信交流群
谢谢,我再修改下,达到我要求了。
  1. data test;
  2.    input ID A1 SUBID;
  3. cards;
  4. 1   1  1
  5. 2   2  1
  6. 2   3  2
  7. 2   3  3
  8. 3   2  1
  9. 3   2  2
  10. 4   4  1
  11. 4   3  2
  12. 4   4  3
  13. 4   2  4
  14. 5   1  1
  15. 6   2  2
  16. 6   2  2
  17. ;
  18. run;

  19. proc sql;
  20.    create table test_MAX_SUBID as
  21.    select id, max(SUBID) as MAX_SUBID
  22.    from test
  23.    group by id;
  24. quit;

  25. proc sql;
  26.    create table test_left_join as
  27.    select * from test left join test_MAX_SUBID
  28.    on test.id=test_MAX_SUBID.id;
  29. run;

  30. data b;
  31.    set test_left_join;
  32.    if A1^=MAX_SUBID;
  33. run;

  34. data b; set b; temp=1; drop subid; run; /*合并到上一步也可以*/

  35. proc sort data=b;  by id; run;
  36. proc sort data=test;  by id; run;

  37. data final;
  38. merge test b;
  39. by id;
  40. if temp=1;
  41. drop temp;
  42. run;
复制代码


使用道具

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

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

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

GMT+8, 2024-3-29 20:58