楼主: 肝贝
1223 2

data步读取数据原理,姚老师书上的一段代码 [推广有奖]

  • 12关注
  • 1粉丝

幸儿

博士生

48%

还不是VIP/贵宾

-

威望
0
论坛币
675 个
通用积分
6.2212
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
294 点
帖子
192
精华
0
在线时间
264 小时
注册时间
2013-11-9
最后登录
2019-11-19

楼主
肝贝 发表于 2015-3-23 10:30:36 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
proc sort data=chapt7.smooth;by cid month;run;
data smooth;
        set chapt7.smooth;
        by cid;
        array lags(12);
        lags(1)=lag(balance);
        do i=2 to 12;
    lags(i)=lag(lags(i-1));
    end;
        do j=12 to 2 by -1;
        if j gt cns then lags(j)=.;
                put j=;
        end;
        if first.cid then do
       cns=0;
       do i=1 to 12;lags(i)=.;
       end;
    end;
        cns+1;
mean6=mean(of lags1-lags6);
mean12=mean(of lags1 - lags12);
drop i j;
run;
书上说first不能放在by的后面,和lag函数有关系,菜鸟不懂,求问原理!!
确实在把first放在前边的时候,运行会报错原因是lags()是还没有定义。
菜鸟还想问,代码在编译的时候生成了什么啊,cns是在第二个do循环里就用到了,但是是在最后的first里,才第一次给cns赋值的啊~~什么原理,使这段代码可以这么用呢?
菜鸟愚昧,求大神指点!!!

二维码

扫码加我 拉你入群

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

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

关键词:data步 读取数据 Data balance smooth balance

I'll never let go.

沙发
tangliang0905 发表于 2015-3-23 10:59:33
第一点,first那步循环的确必须要在array定义lags那步之后,不然lags1,到lags12都没有定义,但是这步和j的那步循环,位置应该可以调换

第二点,SAS是先编译再执行,他在编译的过程中已经发现了下面的CNS+1这个语句,他就自动把他认为是一个numeric value,而且是从0开始的,大概相当于省略了retain cns吧

藤椅
肝贝 发表于 2015-3-23 18:08:32
tangliang0905 发表于 2015-3-23 10:59
第一点,first那步循环的确必须要在array定义lags那步之后,不然lags1,到lags12都没有定义,但是这步和j的那 ...
酱紫啊,谢谢~~

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

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