楼主: crackman
2676 7

[原创博文] 跟crackman读SAS程序(8) [推广有奖]

已卖:401份资源

院士

83%

还不是VIP/贵宾

-

威望
6
论坛币
91928 个
通用积分
23.5045
学术水平
424 点
热心指数
505 点
信用等级
256 点
经验
112978 点
帖子
2940
精华
0
在线时间
2532 小时
注册时间
2007-4-26
最后登录
2025-6-25

初级热心勋章 中级热心勋章 初级学术勋章 初级信用勋章

楼主
crackman 发表于 2010-8-20 21:43:33 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
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.读入一条数据记录,然后执行对这一条数据记录的可以执行的其他语句(这些语句包括对这条记录里面数据的提取、处理等等)
二维码

扫码加我 拉你入群

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

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

关键词:crackman Ackman CRACK sas程序 CRA 缓冲区 count 程序

已有 3 人评分学术水平 热心指数 信用等级 收起 理由
addahello + 1 + 1 + 1 赞!!!!!!!!!!
peijiamei + 3 + 3 对论坛有贡献
hopewell + 1 + 1 + 1 精彩帖子

总评分: 学术水平 + 5  热心指数 + 5  信用等级 + 2   查看全部评分

沙发
hopewell 发表于 2010-8-20 22:28:41
我对这个程序里的_n_比较有兴趣
_n_和_error_是data step里的automatic variable,它们存在于PDV中,由SAS自动赋值,但不会输出到data set。现在问题来了,我们能自己修改_n_的值吗?看log。
  1. data _null_;
  2.     input id count;
  3.     put _n_=;
  4.     do _n_=1 to count;
  5.         put _all_;
  6.         output;
  7.     end;
  8. datalines;
  9. 1 3
  10. 2 5
  11. ;
复制代码
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
addahello + 1 + 1 + 1 赞!!!!!!!!!! 本文来自: 人大经济论坛 SAS专版 版,详细出处参考

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

藤椅
crackman 发表于 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
我想看看差异就知道了吧

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

报纸
soporaeternus 发表于 2010-8-23 09:50:06
  1. data a;
  2.         do i=1 to 3;
  3.                 output;
  4.         end;
  5. run;
  6. data b;
  7.         put "o1 "  _n_=;/*俺就是变得回来*/
  8.         set a;
  9.         put "o2 "  _n_=;
  10.         _n_=(_n_+1)*_n_+1;/*随你怎么变*/
  11.         put "o3 "  _n_=;
  12. run;
复制代码
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循环始都可以变成什么
已有 3 人评分学术水平 热心指数 信用等级 收起 理由
addahello + 1 + 1 + 1 赞!!!!!!!!!!!!
hopewell + 1 + 1 + 1 我很赞同
pobel + 1 + 1 精彩帖子

总评分: 学术水平 + 3  热心指数 + 3  信用等级 + 2   查看全部评分

Let them be hard, but never unjust

地板
woaiwojia9 发表于 2010-9-14 13:35:33
I didn't know _N_ can be used thhis way. Amazing.

7
addahello 发表于 2010-9-14 17:10:21
赞!!!!!!!!!!

8
lifemg 发表于 2010-9-16 10:33:57
偶水平不够,看不大懂,还得潜心研究

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-30 02:52