楼主: 落泪的剑
1755 10

一道小白的SAS题目 [推广有奖]

  • 0关注
  • 0粉丝

本科生

47%

还不是VIP/贵宾

-

威望
0
论坛币
1613 个
通用积分
1.0600
学术水平
1 点
热心指数
1 点
信用等级
1 点
经验
8603 点
帖子
30
精华
0
在线时间
161 小时
注册时间
2010-9-14
最后登录
2019-9-12

15论坛币
这个是原始数据, 原始数据 这个是最终的结果, 最终结果.JPG


大概意思:对name按照year进行cost的累加。输出两张表。输出表一中有3个变量,name,year,sum;期中sum的结果应该是5,4,5,13,8,19,。。。。输出表二中有4个变量,name,year,cost,sum四个变量,sum结果应该为,2,5,4,5,6,13,8,9,19.。。
要求:只需编写程序。优先使用sql语句的sas,也可以写不使用SQL的sas。两者都写出的,则为最佳结果。若无,则以SQL为判定准则。


关键词:sql语句 year name Cost 原始数据 编写程序 sql语句
  1. data one;
  2. input name $ year cost;
  3. cards;
  4. l 1998 2
  5. l 1998 3  
  6. l 1999 4
  7. m 2000 5
  8. m 2001 6
  9. m 2001 7
  10. n 2002 8
  11. n 2003 9
  12. n 2003 10
  13. n 2004 21
  14. n 2004 22
  15. i 2005 23
  16. i 2006 24
  17. i 2006 25
  18. i 2006 26
  19. i 2006 27
  20. ;;;
  21. proc sort data=one out=one;
  22. by name year;
  23. data biao1;
  24. set one;
  25. by name year;
  26. if first.year then sum=0;
  27. sum+cost;
  28. if last.year then output;
  29. drop cost;
  30. run;

  31. data biao2;
  32. set one;
  33. by name year;
  34. if first.year then sum=0;
  35. sum+cost;
  36. run;
复制代码

使用道具

  1. data one;
  2. input name $ year cost;
  3. lagcost=lag(cost);
  4. cards;
  5. l 1998 2
  6. l 1998 3  
  7. l 1999 4
  8. m 2000 5
  9. m 2001 6
  10. m 2001 7
  11. n 2002 8
  12. n 2003 9
  13. n 2003 10
  14. n 2004 21
  15. n 2004 22
  16. i 2005 23
  17. i 2006 24
  18. i 2006 25
  19. i 2006 26
  20. i 2006 27
  21. ;;;
  22. proc sort data=one out=one;
  23. by name year;
  24. run;
  25. data one;
  26. set one;
  27. by name year;
  28. if first.year then count=0;
  29. count+1;
  30. run;


  31. proc sql;
  32. create table biao1 as
  33. select name,year,sum(cost) as sum
  34. from one
  35. group by name,year;

  36. create table biao2 as
  37. select a.name,a.year,a.count,( select sum(cost)  
  38.                                from one as b
  39.                                where a.name=b.name and a.year=b.year and a.count>=b.count
  40.                                ) as sum



  41. from one as a ;
  42. quit;
复制代码


这是用sql实现的 但这里为了生成表2感觉有点把问题复杂化 加入了个count这个变量

使用道具

板凳
落泪的剑 发表于 2015-10-7 11:05:57 |只看作者 |坛友微信交流群
sas那个石家庄人 发表于 2015-10-6 22:33
我问一下,26到29行是什么意思

使用道具

落泪的剑 发表于 2015-10-7 11:05
我问一下,26到29行是什么意思
比如一个i 有很多个年份  遇到一个新的年份时 就将sum复位到0

比如 i  1991    1
       i  1991    2
       i  1992    3
       i  1992    4

第一次遇到1991年 sum复位到0;
sum+cost是一个sum函数也就是sum=sum+cost=0+1=1
因为你的第一个表要求算出每个name下出每一年cost的总sum之后再导出
因此 if last.year then output; 就是让1991年的所有cost一直加
直到最后一次出现1991的时候 再把sum导出来

使用道具

地板
落泪的剑 发表于 2015-10-7 12:40:39 |只看作者 |坛友微信交流群
sas那个石家庄人 发表于 2015-10-7 12:34
比如一个i 有很多个年份  遇到一个新的年份时 就将sum复位到0

比如 i  1991    1
那drop cost是什么意思?感觉这个句子有点累赘。是不是意味着停止自加的过程?
还有一个问题是表二的,根据你的程序好像表二输出只有10个观测值

使用道具

落泪的剑 发表于 2015-10-7 12:40
那drop cost是什么意思?感觉这个句子有点累赘。是不是意味着停止自加的过程?
还有一个问题是表二的,根 ...
drop cost是丢掉cost这个变量 因为你的表一只需要看每年的cost总和sum  而每一年最后一次出现所对应的cost值还继续保留在数据集里就没有什么意义了

我刚运行了下上面两个程序 他们生成的表2都是16个观测值  不知道哪出问题了  有可能代码粘贴到网站上有地方会出错。。。

使用道具

8
落泪的剑 发表于 2015-10-7 13:23:57 |只看作者 |坛友微信交流群
sas那个石家庄人 发表于 2015-10-6 22:33
弱弱的问一下,21和22行的sort by,是干什么用的?为什么我删除了之后,程序就出错了?还有25行的by语句,此处指的是变量吗?

使用道具

落泪的剑 发表于 2015-10-7 13:23
弱弱的问一下,21和22行的sort by,是干什么用的?为什么我删除了之后,程序就出错了?还有25行的by语句, ...
by id year 就会让系统自动生成 first.name last.name first.year last.year 这几个不会出现在结果中的系统变量 我们可以在程序中运用它们来完成想要的操作

比如
               first.year    last.year
l 1991 1    1                 0
l 1991 2    0                 1
l 1992 3    1                 0
l 1992 3    0                 1

因为我们前面计算的cost的sum是不断累加的
我们不能用1991累加后的sum 带入到1992年里面来算
因此当第一次遇到1992年时  first.year的值此时是1 然后sum就会被复位到0 然后开始累加92年的
所有cost。  当第一次遇到93年时 此时first.year又等于1 sum又会被复位 开始累加93年的cost。。。。。。

为了使用by variable这个功能 我们必须要将by 后的变量排序
sort by就是为了排序 删掉后就会报错

使用道具

10
落泪的剑 发表于 2015-10-7 14:16:54 |只看作者 |坛友微信交流群
sas那个石家庄人 发表于 2015-10-7 14:00
by id year 就会让系统自动生成 first.name last.name first.year last.year 这几个不会出现在结果中的 ...
25行的by name year 是为了让系统自动生成 first.name last.name first.year last.year ,21和22的sort by 是为了25行的by这个功能,所以必须保留,这样理解对不对?

使用道具

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

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

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

GMT+8, 2024-4-25 16:16