楼主: Paul_L
1271 5

求教关于 _N_ 的问题 [推广有奖]

  • 0关注
  • 0粉丝

已卖:4份资源

高中生

82%

还不是VIP/贵宾

-

威望
0
论坛币
58 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
1602 点
帖子
16
精华
0
在线时间
56 小时
注册时间
2012-9-10
最后登录
2022-4-10

楼主
Paul_L 发表于 2013-10-12 11:15:41 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
本人刚接触SAS不久,最近看little SAS book 其中有一段程序如下:
data a;
input style $ 1-15 type $ sales;
datalines;
Max Flight            running 1930
Zip Fit Leather      walking 2250
Zoom Airborne    unning 4150
Light Step           walking 1130
Max Step Woven walking 2230
Zip Sneak                    c-train 1190
;
run;

proc means data=a noprint;
var sales;
output out=b sum(sales)=total;
run;

data x ;
if _n_=1 then set b;
set a;
run;


当然,数据集的名字,便于书写,我有所更改,但应该不妨碍阅读。
麻烦哪位高手详细解释一下
if _N_=1 then set b;
set a;   
的原理。


因为按照我的理解  _N_=1时 set b; set a; 然后进入第二次循环,这时候_N_=2  应该直接set a;
那么我就不理解为什么data x的结果会是

Obs_TYPE__FREQ_totalstyletypesales
10612880Max Flightrunning1930
20612880Zip Fit Leatherwalking2250
30612880Zoom Airbornerunning4150
40612880Light Stepwalking1130
50612880Max Step Wovenwalking2230
60612880Zip Sneakc-train1190




因为在我看来 在_N_=2以后 不应该再出现set b;


于是我修改了程序  去掉了set a;
我想看看在没有set a; 仅仅只有
data x ;
if _n_=1 then set b;
run;
这样的条件下, 运行结果会是怎么样。 结果如下:

Obs_TYPE__FREQ_total
10612880
20612880

那么 我的疑问是 为何会有2条记录呢?...


所以麻烦哪位高手详细解释一下这段程序的运行原理,谢谢!!!



ps: 之前有一次发帖被管理员删除,说违反论坛规定,诚不知何处有所违反。


     若此次不慎违反相关规定还烦请留言告知,下次定当改正,此次还望手下留情。


    敬谢!




二维码

扫码加我 拉你入群

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

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

关键词:AIRBORNE WALKING running leather Leathe running little style 程序

沙发
Paul_L 发表于 2013-10-12 11:20:35
以上 两个结果 不知为何  发帖之后就混在一起 看不清了
我再这里 重新发一次, 麻烦各位了
第一个结果:
Obs _TYPE_ _FREQ_     total      style                      type     sales
1         0         6         12880   Max Flight              running    1930
2         0         6         12880   Zip Fit Leather       walking     2250
3         0         6         12880   Zoom Airborne       running    4150
4         0         6         12880   Light Step            walking      1130
5         0         6         12880   Max Step Woven   walking      2230
6         0         6         12880   Zip Sneak              c-train      1190

第二个结果
Obs _TYPE_ _FREQ_ total
1         0         6       12880
2         0         6       12880

藤椅
mingfeng07 学生认证  发表于 2013-10-12 11:38:36
前面那段程序正确的方式应该是如下程序:
data x;
set b;
if _n_=1;
run;
这样就得到只有一个观测值的数据集了。
对于这个程序:
data x;
if _n_=1 then set b;
set a;
run;
这个循环没有任何意义,应该set b语句之前用if 语句 对于data x这个还没有任何观测值的空语句而言没有任何约束性的条件意义,而且从_n_=1 a数据集也已经开始导入了,并不是说在obs=1时只导入b。
欢迎扫一扫我头像关注, 不定期分享SAS技术知识。

板凳
_i_ 发表于 2013-10-12 11:55:24
这是汇总与原数据结合求百分数等的一种方法
具体的执行原理可参考sas course notes:P2

报纸
Rock2000 发表于 2013-10-13 15:20:24
CrackMan 版主在这里的贴,看是否解答你的疑问。

http://crackman.net/?p=1198
  1. proc means data=sashelp.class noprint;
  2. var age;
  3. output out=Stats(drop=_FREQ_ _TYPE_) mean=AvgAge;/*http://crackman.net/?tag=proc-means可以看看proc means的一些介绍*/
  4. run;

  5. data differences_dstep(keep=Name Age AvgAge AgeDiff);
  6. if _n_=1 then set Stats;/*这个最关键的,IF _N_=1第一次为真,所以执行SET STATS语句,读取AVGAGE这个变量值,当_N_=2时,AVGAGE默认为PDV中的上一个值
  7. 也就是第一次读取的AVGAGE的变量值*/
  8. set sashelp.class;
  9. AgeDiff=Age-AvgAge;/*让CLASS数据集中的每一个GAE与AVGAGE减得出新变量AGEDIFF*/
  10. run;

  11. proc print data=differences_dstep;
  12. title1 "Differences from the average";
  13. run;
复制代码

地板
Paul_L 发表于 2013-10-14 08:22:07
Rock2000 发表于 2013-10-13 15:20
CrackMan 版主在这里的贴,看是否解答你的疑问。

http://crackman.net/?p=1198
谢谢您的回复,我是这么理解的了,也就是说在我的程序中,当_N_=2的时候并没有执行set b;而是total的值默认为_N_=1的时候值,所以在_N_>1的观测中,total这个值也会有记录。

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

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