楼主: pinseng
11134 25

[原创博文] 请教一个SAS _n_的问题 [推广有奖]

21
haizhilan 发表于 2011-11-15 15:57:59
SAS向data语句后面指定的数据集中写入数据的情况是这样的:
1.如果数据步中没有set语句,即例如纯粹的data temp; x=1;run程序,SAS执行完一遍,即执行到x=1语句以后即将该条记录写入数据集temp(即temp中只有一条记录x=1),同时,到此结束,SAS继续执行该数据步以后的程序,例如proc print之类的;
2.如果数据步中有set语句,比如data q;set temp;run; 假设temp数据集中有1条记录x=1,那么数据步执行完第1遍以后,将该条记录x=1写入数据集q,同时,还没结束,程序继续回到开头,可以看做从data q语句开始从新执行,继续往下,执行set temp,这时候,temp的最后一条记录已经被读过,没有更多的记录可以读取了,程序跳出该数据步,继续执行后面的proc print之类的,set temp后面即使有语句也不会执行。
关于“if语句不执行,直接走到数据部(不好意思,这里应该是数据步)末尾”,就是指:
data q32;
    if _n_=1 then do until (last);
        set temp nobs=obs end=last;
    end;
run;
执行完第一遍循环,程序回到数据步开头后,_n_=2,所以if语句不执行,即相当于前面所说的第1条,因为后面没有其它语句了,所以直接该写入1条记录到数据集q32中,因为前面set读入的记录没有被改变,所以该条记录再次被写入数据集q32,同时,到此结束(就是前面第1条所说)

22
haizhilan 发表于 2011-11-15 16:16:34
对于这个问题
平时知道的如果这样
set a;
set b;
最后obs的数目应该跟data最少的那个一样多,为什么这儿跟temp一样多?

假设这里数据集a和b分别有2条和4条记录,也依照前面说的两条来判断,平时,之所以最后观测数跟数据最少的那个一样多,是因为执行完第二遍循环后,回到数据步开头,往下执行,执行到set a后,因为数据集a中没有数据可读了,所以直接跳出数据步,继续执行后面的proc print之类的程序
但是,这里,有if判断存在后,当数据步执行完第1遍循环后,回到开头,往下执行,因为_n_=2,所以if then之类的就可以当做他不存在了(虽然if then里面的set temp已经执行到temp数据集的最后一条记录,但是只要不再一次执行这个set temp语句,就不会跳出该数据步),继续执行do until后面的set temp,这时候,读到这个temp的第二条了,读完后将第二条写入q32数据集;继续返回开头,跟上面一模一样,读第三条,直到读完所有的temp数据集位置,数据步结束。
所以说,if then的作用也就在此,阻止了do end里面set语句的执行,如果不阻止,读完一条记录返回后,执行到do end里面的set temp,没有记录,就会直接跳出数据步
造成的结果是忙来忙去,只得到1条记录,显然不是我们想要的

23
pinseng 发表于 2011-11-16 10:05:23
多谢多谢    说的非常的详细清晰  感谢帮忙

我再问一个问题,在下面这个里面,为什么sum_x, sum_y会在set temp的每个观测里面都出现呢?

data q2;
    if _n_=1 then do until (last);
        set temp nobs=obs end=last;
        sum_x+x;
        sum_y+y;
    end;
    set temp;
run;

24
gaotao0727 发表于 2011-11-16 13:56:13
pinseng 发表于 2011-11-15 15:11
麻烦再问一下,这个地方,if到end产生了一个观测值(对x和y),然后后面跟着set temp;

平时知道的如果 ...
按你的写法两个数据集a,b是纵向排列的,后一个数据集覆盖前一个数据集,最终数据集的观测数是两个数据集数目的最小值~不知你明白没
衣带渐宽终不悔,为伊消得人憔悴~~

25
gaotao0727 发表于 2011-11-16 14:23:24
haizhilan 发表于 2011-11-15 16:16
对于这个问题
平时知道的如果这样
set a;
学习了~顶一个~~~
衣带渐宽终不悔,为伊消得人憔悴~~

26
haizhilan 发表于 2011-11-16 19:32:10
pinseng 发表于 2011-11-16 10:05
多谢多谢    说的非常的详细清晰  感谢帮忙

我再问一个问题,在下面这个里面,为什么sum_x, sum_y会在se ...
set 语句读取的变量在pdv中会保留下来,并且每次都会随着第二个set temp中的变量写入数据集

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

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