全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
1243 5
2013-10-12
本人刚接触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: 之前有一次发帖被管理员删除,说违反论坛规定,诚不知何处有所违反。


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


    敬谢!




二维码

扫码加我 拉你入群

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

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

全部回复
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

二维码

扫码加我 拉你入群

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

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

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。
二维码

扫码加我 拉你入群

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

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

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

扫码加我 拉你入群

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

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

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

http://crackman.net/?p=1198
复制代码

二维码

扫码加我 拉你入群

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

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

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这个值也会有记录。
二维码

扫码加我 拉你入群

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

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

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群