/*如果年份相同,则做差分,如果年份不同,则简单复制该数据*/
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;
结果如下:
你看到: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;