全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
1389 4
2012-04-07
小弟最近遇到一个程序,老是不满意,而自己水平有限,特意请教版上各位大神。
我的一个数据集FACTOR3SIZE是这个

code

date

meanri

1

200602

0.036

2

200602

0.0068

3

200602

-0.0082

4

200602

0.025

5

200602

0.014

6

200602

0.017

1

200603

0.034

2

200603

0.0059

3

200603

-0.0078

4

200603

0.026

5

200603

0.018

6

200603

0.014


我希望重新建立个数据集,增加变量SMB,让date相同的SMB都相等,都等于相同date下的编号1,2,3的meanri的均值减去45,6meanri的均值。

我查了下书给的程序是

data factor3size1;

set factor3size;

by date;

smb=(lag5(meanri)+lag4(meanri)+lag3(meanri))/3-(lag2(meanri)+lag(meanri)+meanri)/3;

但是这样编出来运行后,前五个CODE的SMB没有,而且date200603的SMB计算用到了200602的数据,明显不是我想要的结果,而且我还不知道LAG的反函数是什么。

真心求教各位版上大神能否帮忙解决下!


二维码

扫码加我 拉你入群

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

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

全部回复
2012-4-7 12:44:54
复制代码
二维码

扫码加我 拉你入群

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

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

2012-4-7 12:58:36
freerunning_sky 发表于 2012-4-7 12:44
大神,能接着我的data factor3size1;
set factor3size;
by date;
往下做吗?我的数据比较大,那个我贴出来的只是很少的一部分。
谢谢大神了
二维码

扫码加我 拉你入群

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

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

2012-4-9 14:41:03
希望能帮到你
data work.a;
        input code date meanri;
        cards;
        1 200602 0.036
        2 200602 0.0068
        3 200602 -0.0082
        4 200602 0.025
        5 200602 0.014
        6 200602 0.017
        1 200603 0.034
        2 200603 0.0059
        3 200603 -0.0078
        4 200603 0.026
        5 200603 0.018
        6 200603 0.014
        ;
run;

/*首先确保数据根据日期分组只有count数为6的时候才能做下列操作*/
proc sql noprint;
        create table work.b as
                select *,
                        count(date) as cnt
                from work.a
                group by date
                having cnt = 6
                order by date,code;
quit;


/*计算最后smb值*/
data c(drop = smb1 smb2 cnt);
        set work.b;
        by date code;
        if code = 1 then do;
                smb1 = 0;
                smb2 = 0;
        end;

        if code in (1,2,3) then do;
                smb1 = smb1 + meanri;
                retain smb1;
        end;else if code in (4,5,6) then do;
                smb2 = smb2 +meanri;
                retain smb2;
        end;

        if code = 6 then do;
                smb = smb1/3 - smb2/3;
        end;
run;

/*拼接原表*/
proc sql noprint;
        create table work.tmp_final as
                select a.code,
                        a.date,
                        a.meanri,
                        b.smb
                from work.b as a,
                        (select date,
                                        smb
                                from work.c
                                where not missing(smb)
                                order by date) as b
                where a.date = b.date
                order by a.date,a.code;
quit;
二维码

扫码加我 拉你入群

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

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

2012-4-10 21:13:26
chendonghui1987 发表于 2012-4-9 14:41
希望能帮到你
data work.a;
        input code date meanri;
谢谢大神!懂了!
二维码

扫码加我 拉你入群

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

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

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

说点什么

分享

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