全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
1641 2
2013-08-15
我有一组年内的月度累计数据2008-2013,我想把它转成月度发生额,如你所见,做一个差分是合适的。问题在于不能将2009-1 的数据减去2008-12的数据,1月的累计额就是当月发生额,因此我写了如下:
/*如果年份相同,则做差分,如果年份不同,则简单复制该数据*/
data dfhs;
set firehoursum;
year=year(date);
run;
data dfhs;
set dfhs;
IF year=lag(year) THEN do;
DNWG=DIF(NWG);
DNEG=DIF(NEG);
end;
ELSE do;
DECG=ECG;
DNWG=NWG;
end;
run;




结果如下:
nwg.png dnwg.png
你看到:2009年第一个数据没问题,只是单纯复制,问题在2009第二个数据,按理DNWG=DIF(NWG) ,我以为是将2009-3减去2009-2 ,但实际上,程序将2009-3 减去了2008-12 。
所以我的问题是DIF函数到底是怎么个做法,如果要本条观测减去上一条观测该如何做?

楼主自答,欢迎补充:
的确DIF函数不适合在IF语句中使用,具体机理没有详细弄明。
解决方法很简单,将DIF构造的序列在IF语句之外构造好,IF语句中直接引用这些序列。我这里有6个序列要处理:

data dfhs;

setfirehoursum;

year=year(date);

lagyear=lag(year);

DNWG=DIF(NWG);

DNEG=DIF(NEG);

DNCG=DIF(NCG);

DCSG=DIF(CSG) ;

DCCG=DIF(CCG);

DECG=DIF(ECG);

run;

data dfhs;

setdfhs;

IFyear=lagyear THEN do;

MNWG=DNWG;

MNEG=DNEG;

MNCG=DNCG;

MCSG=DCSG ;

MCCG=DCCG;

MECG=DECG;

end;

ELSEdo;

MECG=ECG;

MNWG=NWG;

MNEG=NEG;

MNCG=NCG;

MCSG=CSG;

MCCG=CCG;

end;

run;


二维码

扫码加我 拉你入群

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

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

全部回复
2013-8-15 19:28:07
建议楼主看下DIF函数的说明,DIF函数在IF条件语句中使用要谨慎。
二维码

扫码加我 拉你入群

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

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

2013-8-16 14:53:27
看看这样行不行
data a;
input month$ x;
cards;
201201        1
201202        3
201203        6
201204        10
201205        15
201206        21
201207        28
201208        36
201209        45
201210        55
201211        66
201212        78
201301        13
201302        27
201303        42
201304        58
201305        75
201306        93
201307        112
201308        132
201309        153
201310        175
201311        198
201312        222
;
run;

data a;
set a;
year=substr(month,1,4);
run;

proc sort data=a out=b;
by year month;
run;

data b;
set b;
by year month;
lag_x=lag(x);
if first.year then lag_x=0;
run;
data b;
set b;
y=x-lag_x;
run;
二维码

扫码加我 拉你入群

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

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

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

说点什么

分享

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