全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
2600 7
2010-08-20
data test;
input r count;
do _n_=1 to count;
    output;
end;
datalines;
1 3
2 5
;
run;
http://www.pinggu.org/bbs/thread-880619-1-1.html
原问题
其实这个程序很好很有意思,值得去思考data步里面读取数据的机制
当程序编译的时候,读到INPUT语句结束之后,开始读入第一调观测 就是 1 3
然后执行 DO循环,因为这个时候COUNT=3是明确了,也就是循环3次,并且输出;
输出完之后继续读入第二条观测,就是2 5 重复第一个步骤。

在这里我用朱老师书上对DATA的处理流程
编译SAS语句,包括语法检查
建立 输入缓冲区、程序数据向量PDV、描述信息
开始数据步语句、反复计数
设定PDV的变量值为缺失
数据读入语句,如果有可以读入的数据,则进入下一步
读入一条数据记录
执行其他的可执行的语句
写入一个观测到数据集中

后面四步循环判断


在这里注意几点:
1.PDV中的变量值开始为缺失的,所以在一个数据集临时一个新变量时,最好retain
2.读入一条数据记录,然后执行对这一条数据记录的可以执行的其他语句(这些语句包括对这条记录里面数据的提取、处理等等)
二维码

扫码加我 拉你入群

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

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

全部回复
2010-8-20 22:28:41
我对这个程序里的_n_比较有兴趣
_n_和_error_是data step里的automatic variable,它们存在于PDV中,由SAS自动赋值,但不会输出到data set。现在问题来了,我们能自己修改_n_的值吗?看log。
复制代码
二维码

扫码加我 拉你入群

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

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

2010-8-21 02:31:25
data _null_;

    input id count;

    put _n_=;

    do _n_=1 to count;

        put _all_;

        output;

    end;

datalines;

1 3

2 5

;

LOG如下:

_N_=1
id=1 count=3 _ERROR_=0 _N_=1
id=1 count=3 _ERROR_=0 _N_=2
id=1 count=3 _ERROR_=0 _N_=3
_N_=2
id=2 count=5 _ERROR_=0 _N_=1
id=2 count=5 _ERROR_=0 _N_=2
id=2 count=5 _ERROR_=0 _N_=3
id=2 count=5 _ERROR_=0 _N_=4
id=2 count=5 _ERROR_=0 _N_=5



如何程序改一下:
如下
data _null_;

    input id count;

    put _n_=;

    do obs=1 to count;

        put _all_;

        output;

    end;

datalines;

1 3

2 5

;

看看LOG
_N_=1
id=1 count=3 obs=1 _ERROR_=0 _N_=1
id=1 count=3 obs=2 _ERROR_=0 _N_=1
id=1 count=3 obs=3 _ERROR_=0 _N_=1
_N_=2
id=2 count=5 obs=1 _ERROR_=0 _N_=2
id=2 count=5 obs=2 _ERROR_=0 _N_=2
id=2 count=5 obs=3 _ERROR_=0 _N_=2
id=2 count=5 obs=4 _ERROR_=0 _N_=2
id=2 count=5 obs=5 _ERROR_=0 _N_=2
我想看看差异就知道了吧
二维码

扫码加我 拉你入群

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

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

2010-8-23 09:33:02
斑竹大人,偶从您的“跟crackman读SAS程序(8)”直接 跳级到 “跟crackman读SAS程序(11)”,中间的 (9)、(10)两级哪去了呢?还请您老人家明示,谢谢先!
二维码

扫码加我 拉你入群

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

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

2010-8-23 09:50:06
复制代码
LOG:
o1 _N_=1
o2 _N_=1
o3 _N_=3
o1 _N_=2
o2 _N_=2
o3 _N_=7
o1 _N_=3
o2 _N_=3
o3 _N_=13
o1 _N_=4

一个类似的例子
_N_的价值不在于它等于什么,而在于它每次data循环始都可以变成什么
二维码

扫码加我 拉你入群

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

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

2010-9-14 13:35:33
I didn't know _N_ can be used thhis way. Amazing.
二维码

扫码加我 拉你入群

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

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

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

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