楼主: weisc001
1637 8

sum的问题求助 [推广有奖]

  • 1关注
  • 0粉丝

已卖:1份资源

高中生

47%

还不是VIP/贵宾

-

威望
0
论坛币
8 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
105 点
帖子
18
精华
0
在线时间
19 小时
注册时间
2006-10-18
最后登录
2019-5-7

楼主
weisc001 发表于 2012-4-18 07:47:24 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
sum的问题求助                       

weisc001 » 2012年 4月 17日 周二 5:07 am

                                                data temp;
input id y;
cards;
1 104.932
2 107.732
3 103.121
4 103.340
5 104.653
6 101.401
7 95.430
8 98.784
9 102.981
10 98.921
11 94.178
12 90.831
13 98.756
14 93.079
15 99.559
16 99.036
17 98.258
18 90.956
19 89.173
20 89.344
run;
我想做的就是
对于第i个id,算出sum=sum_{yj>yi}(yj )

就是对于每个obs来说找出比y大的y数值的总和

二维码

扫码加我 拉你入群

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

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

关键词:Sum Input cards Data Temp 问题

沙发
astrozscore 发表于 2012-4-18 08:29:20
What is your j variable?

藤椅
maidenhan 发表于 2012-4-18 09:14:06
Here is my solution.
  1. * 导入原数据 ;
  2. data test01;
  3. input id y;
  4. cards;
  5. 1 104.932
  6. 2 107.732
  7. 3 103.121
  8. 4 103.340
  9. 5 104.653
  10. 6 101.401
  11. 7 95.430
  12. 8 98.784
  13. 9 102.981
  14. 10 98.921
  15. 11 94.178
  16. 12 90.831
  17. 13 98.756
  18. 14 93.079
  19. 15 99.559
  20. 16 99.036
  21. 17 98.258
  22. 18 90.956
  23. 19 89.173
  24. 20 89.344
  25. run;
  26. * 处理多个y值相同的问题 ;
  27. proc sort data = test01; by descending y; run;
  28. data test02;
  29. set test01(drop = id);
  30. by descending y;
  31. if first.y then sum_same_y = 0;
  32. sum_same_y + y;
  33. if last.y;
  34. run;
  35. * 计算比每个y大的所有的y的总和 ;
  36. data test03(keep = y sum_large_y);
  37. retain lasum_large_y lag_y 0;
  38. set test02;
  39. if _n_ = 1 then do;
  40.   lag_y = sum_same_y;
  41.   sum_large_y = 0;
  42. end;else do;
  43.   sum_large_y + lag_y;
  44.   lag_y = sum_same_y;
  45. end;
  46. run;
  47. * 与原数据merge ;
  48. data test04;
  49. merge test01(in=t1)
  50.     test03(in=t3);
  51. by descending y;
  52. if t1 and t3;
  53. run;
  54. proc sort data = test04; by id; run;
复制代码

板凳
shenliang_111 发表于 2012-4-18 09:47:36
  1. /*1.date step*/
  2. data result;
  3. set test01;
  4. sum_y=0;
  5. do i=1 to nobs;
  6.    set test01(keep=y rename=(y=yy)) nobs=nobs point=i;
  7.    sum_y=ifn(y<yy,sum_y+yy,sum_y);
  8. end;
  9. drop yy;
  10. run;
  11. /*2.sql*/
  12. proc sql noprint;
  13.    create table result2 as
  14.     select distinct a.*,sum(b.y) as sum_y
  15.          from test01 a left join test01 b
  16.          on a.y<b.y
  17.          group by a.id;
  18. quit;
复制代码

报纸
chendonghui1987 发表于 2012-4-18 15:47:40
不是很明白楼主的意图

地板
weisc001 发表于 2012-4-19 05:25:21
shenliang_111 发表于 2012-4-18 09:47
这个方法很好,我还有一个问题,有没有可能仍然用data step,但是在loop中不用set data set呢?
这个其实是我的大程序中很小的一部分,我把它尽量简化了。

7
shenliang_111 发表于 2012-4-19 09:03:42
weisc001 发表于 2012-4-19 05:25
这个方法很好,我还有一个问题,有没有可能仍然用data step,但是在loop中不用set data set呢?
这个其实 ...
不懂你的意思...呵呵

8
weisc001 发表于 2012-4-24 07:36:25
shenliang_111 发表于 2012-4-19 09:03
不懂你的意思...呵呵
忽略我上面的帖子吧。这样就对了。我想错了。非常感谢

9
yongjiang2 发表于 2012-10-19 14:38:41
data temp;
input id y;
cards;
1 104.932
2 107.732
3 103.121
4 103.340
5 104.653
6 101.401
7 95.430
8 98.784
9 102.981
10 98.921
11 94.178
12 90.831
13 98.756
14 93.079
15 99.559
16 99.036
17 98.258
18 90.956
19 89.173
20 89.344
;
run;

proc sort data=temp out=temp1;
by  descending y;
run;

data temp2;
        set temp1;
        retain sum_y 0;
        sum_y=sum_y+y;
run;

data temp3(drop=sum_y);
        set temp2;
        sum_y1=sum_y-y;
run;

proc sort data=temp3 out=temp4;
by id;
run;

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

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