楼主: dxystata
916 13

[问答] data如何实现2 [推广有奖]

版主

已卖:302份资源

大师

37%

还不是VIP/贵宾

-

TA的文库  其他...

Software

中英文Ebook

R学习

威望
2
论坛币
183395 个
通用积分
15333.1475
学术水平
208 点
热心指数
271 点
信用等级
174 点
经验
298627 点
帖子
5586
精华
1
在线时间
13632 小时
注册时间
2006-6-21
最后登录
2025-12-2

初级学术勋章 初级热心勋章 中级热心勋章 初级信用勋章

楼主
dxystata 发表于 2023-9-20 08:47:49 |AI写论文
20论坛币
  1. data aaa;
  2. input id x$ group sev;
  3. cards;
  4. 1 aa 1 1
  5. 1 bb 1 1
  6. 1 bb 1 2
  7. 1 bb 1 2
  8. 1 cc 1 2
  9. 1 cc 1 1
  10. 2 dd 1 1
  11. 2 ff 1 3
  12. 2 ff 1 2
  13. 3 aa 2 1
  14. 3 bb 2 2
  15. 3 cc 2 3
  16. 4 aa 2 1
  17. 4 bb 2 2
  18. 4 bb 2 1
  19. 4 cc 2 1
  20. ;
  21. run;
复制代码
要求根据id x两个变量保留sev最大的记录,结果如下:1 aa 1 1
1 bb 1 2
1 bb 1 2
1 cc 1 2
2 dd 1 1
2 ff 1 3
3 aa 2 1
3 bb 2 2
3 cc 2 3
4 aa 2 1
4 bb 2 2
4 cc 2 1

data步如何实现?谢谢!






关键词:Data 如何实现 Group cards Input

沙发
橙红的果士 学生认证  发表于 2023-9-20 08:47:50
  1. data aaa;
  2.         input id x$ group sev;
  3. cards;
  4. 1 aa 1 1
  5. 1 bb 1 1
  6. 1 bb 1 2
  7. 1 bb 1 2
  8. 1 cc 1 2
  9. 1 cc 1 1
  10. 2 dd 1 1
  11. 2 ff 1 3
  12. 2 ff 1 2
  13. 3 aa 2 1
  14. 3 bb 2 2
  15. 3 cc 2 3
  16. 4 aa 2 1
  17. 4 bb 2 2
  18. 4 bb 2 1
  19. 4 cc 2 1
  20. ;
  21. run;

  22. proc sort data=aaa; by id x descending sev ; run;

  23. data want(where=(sev=max));
  24.         set aaa;
  25.         by id x;
  26.         retain max;
  27.         if first.x then max=sev; else if sev>max then max=sev;
  28. run;
复制代码
已有 1 人评分经验 学术水平 热心指数 收起 理由
dxystata + 100 + 1 + 1 热心帮助其他会员

总评分: 经验 + 100  学术水平 + 1  热心指数 + 1   查看全部评分

藤椅
橙红的果士 学生认证  发表于 2023-9-20 09:24:07
  1. data aaa;
  2.         input id x$ group sev;
  3. cards;
  4. 1 aa 1 1
  5. 1 bb 1 1
  6. 1 bb 1 2
  7. 1 bb 1 2
  8. 1 cc 1 2
  9. 1 cc 1 1
  10. 2 dd 1 1
  11. 2 ff 1 3
  12. 2 ff 1 2
  13. 3 aa 2 1
  14. 3 bb 2 2
  15. 3 cc 2 3
  16. 4 aa 2 1
  17. 4 bb 2 2
  18. 4 bb 2 1
  19. 4 cc 2 1
  20. ;
  21. run;

  22. proc sort data=aaa; by id x sev; run;

  23. proc sql;
  24.         create table want as
  25.         select *
  26.         from aaa as a
  27.         where sev=(select max(sev) from aaa where id=a.id and x=a.x)
  28.         order by id, x, sev
  29. ;
  30. quit;
复制代码
已有 1 人评分经验 学术水平 热心指数 收起 理由
dxystata + 100 + 1 + 1 热心帮助其他会员

总评分: 经验 + 100  学术水平 + 1  热心指数 + 1   查看全部评分

板凳
dxystata 发表于 2023-9-20 09:25:19
橙红的果士 发表于 2023-9-20 09:24
data步如何实现?

报纸
dxystata 发表于 2023-9-21 08:51:42
橙红的果士 发表于 2023-9-20 09:50
else if sev>max then max=sev;
这一句是否可以去掉?谢谢!

地板
橙红的果士 学生认证  发表于 2023-9-22 09:11:22
dxystata 发表于 2023-9-21 08:51
else if sev>max then max=sev;
这一句是否可以去掉?谢谢!
这个问题非常好,其实我昨天也是考虑到了,发现这句没啥用,可以直接去掉的。
已有 1 人评分经验 热心指数 收起 理由
dxystata + 100 + 1 热心帮助其他会员

总评分: 经验 + 100  热心指数 + 1   查看全部评分

7
whymath 发表于 2023-9-22 10:16:25
本题的核心是一个表查询(Table Lookup)问题,即要从一个数据集查询某种结果——本题中是分组最大值——然后返回到另外一个数据集中。SQL 其实非常合适解决这类问题,也可以先求得最大值,然后在数据步中使用merge进行数据拼接。
  1. proc sql noprint;
  2.   create table want1 as
  3.   select *
  4.   from aaa
  5.   group by id, x
  6.   having sev=max(sev)
  7.   ;
  8. quit;
复制代码

SAS中还有一些其它的技术也可以快速地实现表查询,例如双重 set、DOW-Loop、hash、直接索引等等。以 DOW-Loop 为例,本题也可以这样做:
  1. data want2;
  2.   do until(last.x);
  3.     set aaa;
  4.     by id x;
  5.     max=max(max,sev);
  6.   end;
  7.   do until(last.x);
  8.     set aaa;
  9.     by id x;
  10.     if sev=max then output;
  11.   end;
  12. run;
复制代码
已有 1 人评分经验 学术水平 热心指数 收起 理由
dxystata + 100 + 1 + 1 鼓励积极发帖讨论

总评分: 经验 + 100  学术水平 + 1  热心指数 + 1   查看全部评分

8
AngleeZZ 发表于 2023-9-22 13:00:12
whymath 发表于 2023-9-22 10:16
本题的核心是一个表查询(Table Lookup)问题,即要从一个数据集查询某种结果——本题中是分组最大值——然后 ...
求教啥是双重 set?
上面的样例code看起来感觉是双重set+DOW Loop组合体。。。
已有 1 人评分经验 热心指数 收起 理由
dxystata + 100 + 1 鼓励积极发帖讨论

总评分: 经验 + 100  热心指数 + 1   查看全部评分

9
AngleeZZ 发表于 2023-9-22 13:04:06
whymath 发表于 2023-9-22 10:16
本题的核心是一个表查询(Table Lookup)问题,即要从一个数据集查询某种结果——本题中是分组最大值——然后 ...
我也是最先想到的就是SQL,
然后是Data步
Hash,索引的话感觉有点高端
不过DOW-Loop的写法看起来很古典呀

10
dxystata 发表于 2023-9-22 15:26:59
程序最好都考虑存在缺失的情况

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-21 12:04