楼主: benny10
2613 9

数据合并问题! [推广有奖]

  • 0关注
  • 0粉丝

硕士生

4%

还不是VIP/贵宾

-

威望
0
论坛币
114 个
通用积分
0
学术水平
0 点
热心指数
1 点
信用等级
0 点
经验
2230 点
帖子
99
精华
0
在线时间
67 小时
注册时间
2007-6-23
最后登录
2020-3-25

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
请教各位前辈,我现在有一个数据合并的问题,不知应如何是好,也不知能不能这么合并!!我的原始资料如下: (说明:原本有两个檔: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
二维码

扫码加我 拉你入群

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

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

关键词:数据合并 请教各位前辈 time date IME 数据合并

回帖推荐

liudeng2005 发表于8楼  查看完整内容

前面的代码不变,后面proc sql改成一下代码,试试看(未测试) proc sql ; create table xxx as select *, min(timed),mintimed from select *,second-osecond as timed,min(calculated timed) as mintimed from b,a group by id1 where timed ge 0 as neg union corr all select *,second-osecond as timed,max(calculated timed) as mintimed from b,a group by id1 where timed lt 0 as pos ...

本帖被以下文库推荐

沙发
liudeng2005 发表于 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;
我就是我@!

使用道具

藤椅
benny10 发表于 2010-11-5 21:02:32 |只看作者 |坛友微信交流群
感谢前辈的回复,但小弟愚眛,还是不能跑,可否请各位前给点建议,拜托了谢谢!
2# liudeng2005

使用道具

板凳
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;
已有 1 人评分热心指数 收起 理由
crackman + 1 热心写了这么多

总评分: 热心指数 + 1   查看全部评分

我就是我@!

使用道具

报纸
benny10 发表于 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。

使用道具

地板
liudeng2005 发表于 2010-11-8 09:08:33 |只看作者 |坛友微信交流群
你自己看看程序吧!只要改数据步两个地方应该就可以了(second 和osecond)
我就是我@!

使用道具

7
benny10 发表于 2010-11-8 16:43:48 |只看作者 |坛友微信交流群
6# liudeng2005
前辈,不好意思,之前没考虑到一种状况,那就是因为我们是从a和b中取离b时间最近的上一笔,因为您是用最小值来计算,但这会发生a的下一笔距离b比a的上一笔距离b还要来得小,使它选取下一笔而不是上一笔数据,造成错误合并的现象,请问这有办法解决吗,谢谢!

使用道具

8
liudeng2005 发表于 2010-11-9 13:35:46 |只看作者 |坛友微信交流群
前面的代码不变,后面proc sql改成一下代码,试试看(未测试)
proc sql ;
create table xxx as
select *, min(timed),mintimed from
    select *,second-osecond as timed,min(calculated timed) as mintimed from b,a
    group by id1 where timed ge 0 as neg  
    union corr all
    select *,second-osecond as timed,max(calculated timed) as mintimed from b,a
    group by id1 where timed lt 0 as pos
group by id1;
quit;
我就是我@!

使用道具

9
benny10 发表于 2010-11-11 08:47:50 |只看作者 |坛友微信交流群
8# liudeng2005

先谢谢前辈了,我会试试看!!

使用道具

10
liudeng2005 发表于 2010-11-11 08:58:18 |只看作者 |坛友微信交流群
大家是交流,不需要前辈前辈的叫。。。。。
我就是我@!

使用道具

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

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

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

GMT+8, 2025-1-15 15:17