楼主: grace_424
7347 9

SAS新手,求助关于累加语句和output语句的问题! [推广有奖]

  • 0关注
  • 0粉丝

大专生

53%

还不是VIP/贵宾

-

威望
0
论坛币
77 个
通用积分
0.1752
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
400 点
帖子
62
精华
0
在线时间
49 小时
注册时间
2012-11-14
最后登录
2017-4-9

楼主
grace_424 发表于 2013-5-31 22:49:32 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
小弟是一个sas新手, 遇到以上问题, 希望高手给与帮助解答!谢谢各位的时候了。

data pay;

  input area amount;

cards;

111 100

111 25

333 160

333 80

777 142.66

;

proc sort data=pay;

  by area;

data subtotal;

  set pay;

  by area;

  if first.area then total=0;

  total+amount;

  drop amount;

  if last.area then output;

run;

proc print;

run;


QQ截图20130531103626.png

请问红色部分运行的逻辑是什么? 哪儿几行的code使111/333的amount相加? 777只有一个记录,如何越过之前相加的步骤?

total=0的作用是什么? total+amount;drop amount;的解释是什么?


谢谢高手的解答!



二维码

扫码加我 拉你入群

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

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

关键词:output put语句 outpu Out put amount 记录 如何

沙发
gazifjfz 发表于 2013-5-31 23:05:28
是不是这样:
1、这段程序想算每个地区(area)工资之和。
2、first.area表示按area排序之后的第一个观测,将total赋为0。
3、然后total+amount,先读第一条记录,用0+100,得到100;再读下一条,100+25得到125,这个就是111 area的工资总数。这样每个地区的工资总合就被积累在area对应的最后一行记录后面的total这一变量中。即111 area最后一条记录应该是111 25 125。想知道每个地区的总工资,把amount扔掉就可以了。
4、最后last.area表示按area排序之后的最后一个观测输出,就可以看到每个地区的总工资了。

藤椅
grace_424 发表于 2013-6-1 02:21:33
不好意思,我还是有些问题不是很明白
1) 如何通过total+amount这个式子等到total 125。 我不是很明白程序的运行, 可不可以从累加语句的角度给我讲解一下?
2) if last.area then output;:这对这个语句,如何判断142.66最后赋值给total, 而不是amount?

我知道可能我的问题有时候比较幼稚, 新手, 请谅解!

板凳
Eternal0601 发表于 2013-6-1 16:32:06
grace_424 发表于 2013-6-1 02:21
不好意思,我还是有些问题不是很明白
1) 如何通过total+amount这个式子等到total 125。 我不是很明白程序 ...
1)total + amount实际是一个累加语句,total是一个累加变量,amount是在total变量的基础上累加,每次total+amount后的值都是作为total变量的值,这个语句中的total变量是自动retain的,即每次循环后不会自动清空

2)142.66

报纸
Eternal0601 发表于 2013-6-1 16:36:27
Eternal0601 发表于 2013-6-1 16:32
1)total + amount实际是一个累加语句,total是一个累加变量,amount是在total变量的基础上累加,每次tot ...
2)142.66这条记录对应的area只有一条,所以sort之后,first.area和last.area都为1,前面有if first.area将total初始化为0,紧接着有累加,total的值就变为142.66,后面的last.area if条件为真,相应的记录也就输出来了

地板
grace_424 发表于 2013-6-3 00:41:08
Eternal0601 发表于 2013-6-1 16:36
2)142.66这条记录对应的area只有一条,所以sort之后,first.area和last.area都为1,前面有if first.area将 ...
不好意思,还得麻烦你!
1)  first.area/last.area指的是包含所有area(111/333/777)的记录?还是只指定area下的first.area/last.area(比如在area111下的first.area/last.area)?
2)对于142.66这条记录,为什么您说‘前面有if first.area将total初始化为0,紧接着有累加,total的值就变为142.66’?

7
gaotao0727 发表于 2013-6-3 10:25:04
grace_424 发表于 2013-6-3 00:41
不好意思,还得麻烦你!
1)  first.area/last.area指的是包含所有area(111/333/777)的记录?还是只指定 ...
1.这里面的first与last都是对每个area而言的,遇到新的area(first.area),total=0;遇到这个area的最后一条记录,输出累加后的total值;
2.这涉及到SAS读取记录的机制,SAS是读取一条记录,处理一条,再读取第二条。当SAS读取一个新的area时,total=0,累加这个amount;当读取这个area的第二条记录时,直接累加;......当读完这个area的所有记录时,输出累加后的total值;
衣带渐宽终不悔,为伊消得人憔悴~~

8
butterfly1107 发表于 2014-10-22 14:31:57
学习啦

9
忍冬属 发表于 2016-11-16 09:59:14
说的挺好的,终于明白了

10
徐世福2 发表于 2016-11-16 10:02:34

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

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