作者wlsherica (CrevetteStudio)
看板Statistics
标题Re: [程式] SAS 取上一笔资料
时间Wed Aug 18 10:40:31 2010
※ 引述《wlsherica (CrevetteStudio)》之铭言:
有个合并的问题想请教各位,原始资料是A档与B档
共同变项为Indo与yrmon(及西元年与该月份)
现在多跑出一个问题是抓季资料
A档
Indo yrmon price
1101 200104 8.2
3108 200201 5.8
B档(季资料)
Indo yrmon vol
1101 200103 23
3108 200103 16
1101 200106 20
3108 200106 18
1101 200109 22
3108 200109 19
1101 200112 25
3108 200112 15
1101 200203 28
3108 200203 14
希望以Indo变项当作index去作合并成以A档为base的档案
由於B档是季资料,不是每一个月都有vol的值可以出来
如果是3,6,9,12的月份, 就当月合并自然OK
若是其它月份, 就必须去
抓前一季的值
1101 200104 是四月, 所以得去抓200103的vol 23
3108 200202 是二月, 所以得去抓200112的 vol 15
C档
Indo yrmon price vol
1101 200104 8.2 23
3108 200202 5.8 15
--------------------------
原本想法是用时间函数中的QTR函数,不过QTR内要摆date。
後来想那就设每个yrmon给一个该季的值(若为1,2,3则为第一季,以此类推)
但是遇到12月份的值就会抓错季
所以也要同时考虑年份吧..~"~
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 219.86.133.37
1F:→ ASD332:PROC SQL 会不会比较快一点? 08/17 23:35
2F:推 MmmRrrrX:把B档的yrmon删掉在merge by Indo (?) 08/18 01:09
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 163.25.110.97
※ 编辑: wlsherica 来自: 163.25.110.97 (08/18 10:43)
3F:推 imaltar:意思是说B档的月份一定是3 6 9 12罗 一样抓当月 08/18 11:34
4F:→ imaltar:不同抓前一季 是这样吗 08/18 11:35
5F:→ wlsherica:回i大,没错,我还在测试中+_+ 08/18 11:52
6F:→ MmmRrrrX:若照这样说明,上面应该是可以做到你所要的 08/18 18:35
7F:→ MmmRrrrX:如果AB年月相同 temp=0,抓到的就是相同的那个月 08/18 18:37
8F:→ MmmRrrrX:如果年月不同,抓到的会是B中离A最近的那个月份 08/18 18:38
9F:→ MmmRrrrX:如果indo数不会太多,把倒数第二行drop a temp 删掉 08/18 18:39
10F:→ MmmRrrrX:比对看看有没有出错 08/18 18:40
---------------------
我整理+做点微调提供data step的做法之一
/*原始资料a与b进行sort排序*/
proc sort data=b; by indo; run;
proc sort data=a; by indo; run;
/*a与b档案利用indo变项合并*/
data e;
merge a b(rename=(yrmon=a));/*其中档案b的变项yrmon名称改成a*/
by indo;
temp=yrmon-a;/*两个变项相减成为变项temp*/
if temp>0;/*如果temp>0时output出来*/
run;
/*对新档案e作sort排序*/
proc sort data=e; by indo temp; run;
/*取每个indo变项的第一笔资料*/
data c;
set e;
by indo;
if first.indo then output;
run;
完成
ASD大的SQL做法也很棒,谢谢提供意见与参与讨论的版友 m(__ __)m
※ 编辑: wlsherica 来自: 163.25.110.97 (08/19 09:07)