全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
1176 2
2015-03-23
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赋值的啊~~什么原理,使这段代码可以这么用呢?
菜鸟愚昧,求大神指点!!!

二维码

扫码加我 拉你入群

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

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

全部回复
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的那 ...
酱紫啊,谢谢~~
二维码

扫码加我 拉你入群

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

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

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

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