楼主: hurley18
362 4

[SAS EM] 求变量排序问题 [推广有奖]

  • 0关注
  • 0粉丝

本科生

51%

还不是VIP/贵宾

-

威望
0
论坛币
12 个
通用积分
0.0073
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
143 点
帖子
44
精华
0
在线时间
121 小时
注册时间
2022-1-7
最后登录
2023-10-22

3论坛币
假设数据表test中有A、B、C、D、E、F六个变量,如何实现新增64变量max1,max1V,max3,maxV分别等于6个值大小排序中的最大值和记录最大值的变量名和记录第3大值的变量名(如果两个变量值相等,则记录为两个变量值的复合)原始表
obs     A       B      C      D      E      F
1       5       6      4       10     8      9
2       8       6      6       5       9      4
应该得到新的数据表
obs     A       B      C      D      E      F      max1        max1V      max2      max2V   
1       5       6      4       10     8      9        10             D            8             E
2       8       6      6       5       9      4         9             F             6             BC

求助各位大神,这个逻辑如何实现?


最佳答案

whymath 查看完整内容

若你希望第三行返回的第3大的值为 6,则有另外一种做法——寻找最大的值,然后将它写成缺失。重复3次,第3次的最大值即为要寻找的第3大的值。
关键词:如何实现 test max 数据表 obs
沙发
whymath 发表于 2023-5-5 16:17:29 |只看作者 |坛友微信交流群
若你希望第三行返回的第3大的值为 6,则有另外一种做法——寻找最大的值,然后将它写成缺失。重复3次,第3次的最大值即为要寻找的第3大的值。
  1. data test;
  2.   input A B C D E F;
  3.   cards;
  4. 5 6 4 10 8 9
  5. 8 6 6 5 9 4
  6. 8 6 6 9 9 4
  7. 9 9 9 9 9 9
  8. ;
  9. run;

  10. data want;
  11.   set test;

  12.   array _par_[6] A B C D E F;
  13.   array _tmp_[6]_temporary_;
  14.   array _max_[3]max1-max3;
  15.   array _maxv_[3]$42. max1v max2v max3v;

  16.   do i=1 to dim(_par_);
  17.     _tmp_[i]=_par_[i];
  18.   end;

  19.   do t=1 to 3;
  20.     _max_[t]=max(of _tmp_[*]);
  21.     do i=1 to dim(_par_);
  22.       if _tmp_[i]=_max_[t]^=. then do;
  23.         _maxv_[t]=catx(',',_maxv_[t],vname(_par_[i]));
  24.         _tmp_[i]=.;
  25.       end;
  26.     end;
  27.   end;
  28. run;
复制代码

使用道具

藤椅
whymath 发表于 2023-5-5 20:40:34 |只看作者 |坛友微信交流群
是否考虑最大值存在结的情况?如 A 和 B 的值都是最大值时,是否也将结果写作 A, B ?
若不存在第3大的值怎么办?如 A 至 F 的值都一样大,此时第3大的值是否为缺失值?

使用道具

板凳
whymath 发表于 2023-5-5 21:07:39 |只看作者 |坛友微信交流群
假设刚才所提的两个问题都有肯定的回答。
  1. data test;
  2.   input A B C D E F;
  3.   cards;
  4. 5 6 4 10 8 9
  5. 8 6 6 5 9 4
  6. 8 6 6 9 9 4
  7. 9 9 9 9 9 9
  8. ;
  9. run;

  10. data want;
  11.   set test;

  12.   length max1 8 max1v $42. max3 8 max3v $42.;
  13.   array _par_[6] A B C D E F;
  14.   array _gt_[6]_temporary_;

  15.   max1=max(of _par_[*]);
  16.   call missing(of _gt_[*]);

  17.   do i=1 to dim(_par_);
  18.     if _par_[i]=max1 then max1v=catx(',',max1v,vname(_par_[i]));
  19.     do j=1 to dim(_par_);
  20.       if _par_[i]<_par_[j] then _gt_[i]+1;
  21.     end;
  22.     if _gt_[i]=2 then do;
  23.       max3=_gt_[i];
  24.       max3v=catx(',',max3v,vname(_par_[i]));
  25.     end;
  26.   end;
  27. run;
复制代码

使用道具

报纸
hurley18 发表于 2023-5-6 17:56:06 |只看作者 |坛友微信交流群
谢谢大神虽然还没看懂,但是结果很赞

使用道具

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

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

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

GMT+8, 2024-4-27 23:19