SAS中文论坛

标题: 关于 _n_ 的一个问题 [打印本页]

作者: shiyiming    时间: 2010-8-12 23:36
标题: 关于 _n_ 的一个问题
下面这段code是为了随机取一些data comp的记录:

data comp;
input x1 x2 x3 f;
cards;
1 1 1 4
1 2 1 5
2 1 1 3
2 2 1 2
1 1 2 1
1 2 2 8
2 1 2 7
2 2 2 6
;
run;
data one;
set comp;
if _n_=rantbl(1230,0.2,0.3,0.5);
run;
data three;
set comp;
if _n_=3;
run;
data two;
a=rantbl(1230,0.2,0.3,0.5);
run;
proc print data=comp;
run;
proc print data=one;
run;
proc print data=two;
run;
proc print data=three;
run;

data one和data three的结果在输出中看到的是不同的:
data one:               Obs    x1    x2    x3    f
                                     1      1     2     1    5
                                     2      2     1     1    3
data three:                Obs    x1    x2    x3    f
                                     1      2     1     1    3
为什么会有这种问题呢?是不是和_n_的某些原理相关呢?
作者: shiyiming    时间: 2010-8-13 06:05
标题: Re: 关于 _n_ 的一个问题
rantbl()按照20%,30% 和50%的几率生成1, 2 或3 这三个数。所以,你只能在前三个记录上打转儿。
data1有两个碰上了,所以两个记录;data3:_n_ =3; 所以一个记录...
其实说来说去,我都不明白你在问什么你要干什么。抱歉。
作者: shiyiming    时间: 2010-8-13 09:34
标题: Re: 关于 _n_ 的一个问题
我觉得 rantbl() 应该是得出一个数吧

那么生成data one 的时候也就该只有一条记录呀

怎么会在结果里出来两条记录呢
作者: shiyiming    时间: 2010-8-13 09:46
标题: Re: 关于 _n_ 的一个问题
原来疑惑在这里。data step里的dataset ,也就是comp, 里的行是个暗含的循环(恰当吗?)也就是说一条记录要执行一次,也就是说,因为set comp里有8条记录,所以rantbl()要执行8次,同时也做了8次判断。在这8次里,恰巧有2个生成的数和_n_(=12。。。8)是吻合的,故此输出。data2里没有set,所以没有隐藏的循环(?)也没有明确的do loop循环,那么一条命令只执行一次了。所以只有一个记录。data3做8次判断,因_n_ unique, 所以只有一次成立因而输出一条记录。
我讲的不好,但是有人讲得好。你看看他们是怎么说的。不过,这应该是sas入门最关键的概念之一了。
作者: shiyiming    时间: 2010-8-13 11:36
标题: Re: 关于 _n_ 的一个问题
楼上的大牛讲的真好,第二个data里,set的循环是每次都和固定值3做比对,所以就只保留一次记录。豁然开朗啊。

我不是主要用sas,就是拿一些code看着学的......
作者: shiyiming    时间: 2010-8-18 00:20
标题: Re: 关于 _n_ 的一个问题
run the following SAS code mulitple times, and check the SAS log, and you may totally understand how this procdure works.[code:ebt00j6h]data one;
set comp;
if _n_=rantbl(0,0.2,0.3,0.5);
putlog _all_;
run;[/code:ebt00j6h]




欢迎光临 SAS中文论坛 (https://mysas.net/forum/) Powered by Discuz! X3.2