楼主: 许愿142001
2692 4

[问答] sas怎样实现行与行之间的计算? [推广有奖]

  • 5关注
  • 0粉丝

已卖:45份资源

本科生

37%

还不是VIP/贵宾

-

威望
0
论坛币
433 个
通用积分
0.1200
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
4060 点
帖子
59
精华
0
在线时间
42 小时
注册时间
2016-8-31
最后登录
2024-12-1

楼主
许愿142001 发表于 2016-9-14 11:22:25 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
课堂上的一道题,求每个人与他身高最近的人,并在后面输出姓名,数据集附在下面:

一种思路 数据集自己拼接,删掉姓名相同的记录,按name分组,having  diff=min(diff),

当时我第一想法是排序,算出一条记录height与前后的差值在进行比较,一直没弄出来,求助!

第一个思路的代码,传图片了,第一次发帖,新手勿喷,谢谢。

Name    Height
Joyce    51.3
Louise    56.3
Alice    56.5
James    57.3
Thomas    57.5
John    59
Jane    59.8
Jeffrey    62.5
Carol    62.8
Henry    63.5
Judy    64.3
Janet    64.5
Robert    64.8
Barbara    65.3
Mary    66.5
William    66.7
Ronald    67
Alfred    69
Philip    72


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:Jeffrey William Barbara Alfred having having 图片 记录 课堂 拼接

一种思路.PNG (27.07 KB)

一种思路.PNG

沙发
孤单的我们 发表于 2016-9-14 12:57:04
  1. data test;
  2. input Name $ Height;
  3. cards;
  4. Joyce 51.3
  5. Louise 56.3
  6. Alice 56.5
  7. James 57.3
  8. Thomas 57.5
  9. John 59
  10. Jane 59.8
  11. Jeffrey 62.5
  12. Carol 62.8
  13. Henry 63.5
  14. Judy 64.3
  15. Janet 64.5
  16. Robert 64.8
  17. Barbara 65.3
  18. Mary 66.5
  19. William 66.7
  20. Ronald 67
  21. Alfred 69
  22. Philip 72
  23. ;
  24. run;

  25. proc sort data=test;by height;run;

  26. data a;
  27.         set test;
  28.         dif1=dif(height);
  29.         name1=lag(name);
  30. run;

  31. data want;
  32.         length name $8 height 8 close $8;
  33.         merge a a(keep=dif1 name rename=(dif1=dif2 name=name2) firstobs=2);
  34.         if missing(dif1) | dif1>dif2>. then close=name2;
  35.         else close=name1;
  36.         keep name height close;
  37. run;
复制代码
已有 1 人评分论坛币 收起 理由
admin_kefu + 20 热心帮助其他会员

总评分: 论坛币 + 20   查看全部评分

藤椅
许愿142001 发表于 2016-9-15 11:10:55
非常感谢 ,已经解决问题。

有一个小小问题
  1. data want;
  2.         length name  8height8close8 height 8 close 8;
  3.         merge a a(keep=dif1 name rename=(dif1=dif2 name=name2) firstobs=2);
  4.         if missing(dif1) | dif1>dif2>. then close=name2;
  5.         else close=name1;
  6.         keep name height close;
  7. run;
复制代码

[img][/img]

我把后面稍微改了改
  1. data b;
  2.         set a;
  3.         keep dif1 name;
  4.         rename dif1=dif2;
  5.         rename name=name2;
  6. run;

  7. data want;
  8.       
  9.         merge a b (firstobs=2);
  10.         if missing(dif1) | dif1>dif2>. then close=name2;
  11.         else close=name1;
  12.         keep name height close;
  13. run;
复制代码

[img][/img]

请问这有什么差别吗?

板凳
许愿142001 发表于 2016-9-15 11:17:31
孤单的我们 发表于 2016-9-14 12:57
直接复制出现这种情况

捕获.PNG (68.72 KB)

捕获.PNG

报纸
wang1839 在职认证  发表于 2016-9-22 11:35:12
  1. data a;
  2. input Name $10.   Height;
  3. cards;
  4. Joyce     51.3
  5. Louise    56.3
  6. Alice     56.5
  7. James     57.3
  8. Thomas    57.5
  9. John      59
  10. Jane      59.8
  11. Jeffrey   62.5
  12. Carol     62.8
  13. Henry     63.5
  14. Judy      64.3
  15. Janet     64.5
  16. Robert    64.8
  17. Barbara   65.3
  18. Mary      66.5
  19. William   66.7
  20. Ronald    67
  21. Alfred    69
  22. Philip    72
  23. ;
  24. run;


  25. proc sort data=a;
  26.         by height;
  27. run;


  28. data b;
  29.         set a end=eof;
  30.         namelag=lag(Name);heightlag=lag(height);
  31.         if not eof then do;
  32.         pt=_n_+1;
  33.         set a (rename=(Name=name1 height=height1)) point=pt;
  34.         end;
  35. run;

  36. data c;
  37.         length person $20;
  38.         set b end=eof;
  39.         if _n_=1 then person=name1;
  40.         else if eof then person=namelag;
  41.         else do;
  42.         diff1=height-heightlag;
  43.         diff2=height1-height;
  44.         if diff1<diff2 then person=namelag;
  45.         else if  diff1>diff2 then person=name1;
  46.         else person=catx(',',namelag,name1);
  47.         end;
  48.         keep name height person;
  49. run;
复制代码
已有 1 人评分论坛币 收起 理由
admin_kefu + 20 热心帮助其他会员

总评分: 论坛币 + 20   查看全部评分

A man who is frustrated will never stand up.

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-9 03:32