楼主: firefox29
1470 2

想调整年内累计数据做差分,SAS做差分没成功 [推广有奖]

  • 11关注
  • 1粉丝

博士生

28%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0
学术水平
1 点
热心指数
1 点
信用等级
1 点
经验
3694 点
帖子
131
精华
0
在线时间
305 小时
注册时间
2012-1-23
最后登录
2023-6-20

相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
我有一组年内的月度累计数据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;


二维码

扫码加我 拉你入群

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

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

关键词:累计数据 累计数 hours year Data 程序 如何

沙发
TOBESASP 发表于 2013-8-15 19:28:07 |只看作者 |坛友微信交流群
建议楼主看下DIF函数的说明,DIF函数在IF条件语句中使用要谨慎。

使用道具

藤椅
semenljw 在职认证  发表于 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;

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-5-1 10:19