全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
2745 9
2010-11-05
请教各位前辈,我现在有一个数据合并的问题,不知应如何是好,也不知能不能这么合并!!我的原始资料如下: (说明:原本有两个檔:A、B,我想以B为基准来合并A,条件为以B中的时间和A中的时间最接近的那一笔来为两檔合并,最后结果希望变成D檔,但我只会将两檔并起来,但因time不一致,所以并起来变成C檔,而这并不是我要的檔,希望各位前辈帮个忙,帮帮我应如何解决此一问题,谢谢各位了!)
檔A
no time   date     p1    q1
1  100641 20090521 3270  4429
1  100706 20090521 3275  4463
1  104116 20090521 3250  7243
1  104141 20090521 3250  7301
1  104206 20090521 3250  7309
1  104231 20090521 3245  7312
1  122911 20090521 3320  11821
1  132405 20090521 3350  15660
檔B
sn oq  op   odate    otime  ep   eq
1101 5000 32.85 20090521 100713 32.75 5000
1101 1000 30.6 20090521 104202  
1101 5000 33.25 20090522 122937 33.2 3000
1101 5000 33.25 20090522 122937 33.25 2000
1102 5000 33.2 20090522 132605 33.2 2000
1103 5000 33 20090522 132704 33 2000
檔C
no time   date     p1    q1                            sn oq  op   odate    otime  ep   eq
1  100641 20090521 3270  4429
1  100706 20090521 3275  4463
                                                                     1  50  3285 20090521 100713 3270 5000
1  104116 20090521 3250  7243
1  104141 20090521 3250  7301
                                                                       1  10  3060 20090521 104202  .    .
1  104206 20090521 3250  7309
1  104231 20090521 3245  7312
1  122911 20090521 3320  11821
                                                                     1  20  3325 20090521 122937 3320 20
                                                                     1  50  3325 20090521 122937 3325 25
1  132405 20090521 3350  15660
                                                                     1  20  3325 20090521 122937 3320 20
                                                                     1  50  3325 20090521 122937 3325 25
檔D
sn oq  op   odate    otime  ep   eq   no time   date     p1    q1     
1  50  3285 20090521 100713 3270 5000 1  100641 20090521 3270  4429
1  10  3060 20090521 104202  .    .   1  104141 20090521 3250  7301
1  20  3325 20090521 122937 3320 20   1  122911 20090521 3320  11821
1  50  3325 20090521 122937 3325 25   1  122911 20090521 3320  11821
1  40  3320 20090521 132605 3320 15   1  132405 20090521 3350  15660
1  50  3300 20090521 132704 3300 30   1  132405 20090521 3350  15660
二维码

扫码加我 拉你入群

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

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

全部回复
2010-11-5 15:11:07
我不知道下面的程序行不行,但我想思路是对的,我没法测试,你自己试试看吧

data a;
set a;
I+1;
id1=put(I+1,2.);
run;

proc sql select *,time-notime as timed from a,b by id1  where having timed = min(calculated  timed) ;quit;
二维码

扫码加我 拉你入群

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

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

2010-11-5 21:02:32
感谢前辈的回复,但小弟愚眛,还是不能跑,可否请各位前给点建议,拜托了谢谢!
2# liudeng2005
二维码

扫码加我 拉你入群

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

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

2010-11-6 22:25:31
不知道我跑得对不对,你的原始数据如果可以的话,可以直接把日期和时间当成一个变量录入,这样方便以后的比较。

PS:不该说的:你给的例子里面的合并结果可能本身就有问题(b的第一条应该对应a的第2条吧),如果可以,提问题的时候请先自己搞清楚

options yearcutoff=2000;

data a;
input no time time8.   +1 date yymmdd10.     p1    q1;
second=(date-'21may2009'd)*24*60*60+time;
cards;
1 10:06:41 2009-05-21 3270 4429
1 10:07:06 2009-05-21 3275 4463
1 10:41:16 2009-05-21 3250 7243
1 10:41:41 2009-05-21 3250 7301
1 10:42:06 2009-05-21 3250 7309
1 10:42:31 2009-05-21 3245 7312
1 12:29:11 2009-05-21 3320 11821
1 13:24:05 2009-05-21 3350 15660
;
run;

data b;
infile cards missover;
input sn oq  op   odate yymmdd10.  +1 otime time8.  ep   eq;

osecond=(odate-'21may2009'd)*24*60*60+otime;
cards;
1101 5000 32.85 2009-05-21 10:07:13 32.75 5000
1101 1000 30.6 2009-05-21 10:42:02            
1101 5000 33.25 2009-05-22 12:29:37 33.2 3000
1101 5000 33.25 2009-05-22 12:29:37 33.25 2000
1102 5000 33.2 2009-05-22 13:26:05 33.2 2000
1103 5000 33 2009-05-22 13:27:04 33 2000
;

run;

data b;
set b;
i+1;
id1=put(i,2.);
run;

proc sql ;
create table new  
as select *,abs(second-osecond) as timed from b,a
group by id1
having timed = min(calculated  timed) ;quit;
二维码

扫码加我 拉你入群

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

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

2010-11-7 16:16:58
4# liudeng2005

先谢谢这位前辈用心的指教,至于您所提出的问题“b的第一条应该对应a的第2条吧”,但我本来就是要以b檔为基础来合并a文件(b文件数据量较小而a文件资料量大。)而合并的d檔就是以b檔来合并a檔,抓取a檔中时间最接近b檔的时间点,(所以说b檔资一定都会存在,而a檔就只取最近的那一笔来合并)成为d檔(此檔一定会等于b文件的数据量)。  真是不好意思,表达能力有点差,不知前辈有没有看懂并解决您的疑惑,谢谢!

Ps:您所写的程序还是有些问题,如new中第3和4笔otime 为122937 所以应对应到檔a中的122911,而不是132405。
二维码

扫码加我 拉你入群

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

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

2010-11-8 09:08:33
你自己看看程序吧!只要改数据步两个地方应该就可以了(second 和osecond)
二维码

扫码加我 拉你入群

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

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

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

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