SAS中文论坛
标题:
时间不同檔合并上的问题?
[打印本页]
作者:
shiyiming
时间:
2011-7-13 08:52
标题:
时间不同檔合并上的问题?
各位前辈,小弟遇到了一个数据整合上的困难,想来请教各位前辈!我现在有二个已知的档案,分别为档案A(数据笔数少)和档案B(数据笔数多),而我想将这两个档案合并,但因为两个档案中的时间不一致,导致合并出来的檔中存在许多空格。而现在小弟想把这些空格用现有的值补上去(由下方的数值来补上方的空格),但不知该如何进行,也请各位前辈帮个忙,提供一些方法给小弟我,以解决我的难题,谢谢各位!
(我已用merge A B; by id date time; 将两文件合并成流程2,但流程3完成不了!!)
流程1
档案A
id date time bp1 bq1 sp1 sq1
TXFE5 20050503 8450800 5800 4 5803 7
TXFE5 20050503 8451300 5801 36 5805 12
TXFE5 20050503 8451800 5805 12 5807 1
TXFE5 20050503 8451800 5805 12 5807 1
档案B
id date time bp1 bq1 sp1 sq1 deal ep1 eq1
TXFE5 20050503 8450600 8450618 5800 1
TXFE5 20050503 8450700 8450685 5801 3
TXFE5 20050503 8450900 8450872 5803 7
TXFE5 20050503 8450900 8450905 5804 1
TXFE5 20050503 8451400 8451358 5805 12
TXFE5 20050503 8451500 8451445 5805 2
TXFE5 20050503 8451600 8451602 5805 1
TXFE5 20050503 8451800 5805 12 5807 1 8451778 5807 1
TXFE5 20050503 8451800 5805 12 5807 1 8451856 5807 1
流程2:合并(已完成此部分)
id date time bp1 bq1 sp1 sq1 ep1 eq1
TXFE5 20050503 8450600 5800 4 5803 7 5800 1
TXFE5 20050503 8450700 5800 4 5803 7 5801 3
TXFE5 20050503 8450800 5800 4 5803 7
TXFE5 20050503 8450900 5801 36 5805 12 5803 7
TXFE5 20050503 8450900 5801 36 5805 12 5804 1
TXFE5 20050503 8451300 5801 36 5805 12
TXFE5 20050503 8451400 5805 12 5807 1 5805 12
TXFE5 20050503 8451500 5805 12 5807 1 5805 2
TXFE5 20050503 8451600 5805 12 5807 1 5805 1
TXFE5 20050503 8451800 5805 12 5807 1 5807 1
TXFE5 20050503 8451800 5805 12 5807 1 5807 1
流程3((想要完成的结果,但不知如何完成))
id date time bp1 bq1 sp1 sq1 ep1 eq1
TXFE5 20050503 8450600 5800 4 5803 7 5800 1
TXFE5 20050503 8450700 5800 4 5803 7 5801 3
TXFE5 20050503 8450800 [color=#FF0000:225qrv3i]5800 4 5803 7[/color:225qrv3i]
TXFE5 20050503 8450900 5801 36 5805 12 5803 7
TXFE5 20050503 8450900 5801 36 5805 12 5804 1
TXFE5 20050503 8451300 [color=#FF0000:225qrv3i]5801 36 5805 12[/color:225qrv3i]
TXFE5 20050503 8451400 5805 12 5807 1 5805 12
TXFE5 20050503 8451500 5805 12 5807 1 5805 2
TXFE5 20050503 8451600 5805 12 5807 1 5805 1
TXFE5 20050503 8451800 [color=#FF0000:225qrv3i]5805 12 5807 1[/color:225qrv3i] 5807 1
TXFE5 20050503 8451800 5805 12 5807 1 5807 1
作者:
shiyiming
时间:
2011-7-13 23:02
标题:
Re: 时间不同檔合并上的问题?
yours data set:
[code:1kn1a63p]data a;
input id $ date time bp1 bq1 sp1 sq1;
cards;
TXFE5 20050503 8450800 5800 4 5803 7
TXFE5 20050503 8451300 5801 36 5805 12
TXFE5 20050503 8451800 5805 12 5807 1
TXFE5 20050503 8451800 5805 12 5807 1
;
data b;
infile cards dsd missover;
input id $ date time bp1 bq1 sp1 sq1 deal ep1 eq1;
cards;
TXFE5,20050503,8450600,,,,,8450618,5800,1
TXFE5,20050503,8450700,,,,,8450685,5801,3
TXFE5,20050503,8450900,,,,,8450872,5803,7
TXFE5,20050503,8450900,,,,,8450905,5804,1
TXFE5,20050503,8451400,,,,,8451358,5805,12
TXFE5,20050503,8451500,,,,,8451445,5805,2
TXFE5,20050503,8451600,,,,,8451602,5805,1
TXFE5,20050503,8451800,5805,12,5807,1,8451778,5807,1
TXFE5,20050503,8451800,5805,12,5807,1,8451856,5807,1
;
data c;
merge b a;
by id date time;
run;
[/code:1kn1a63p]
方法不是很好用的hash,看看下边编写的这段代码运行结果是不是你想要的!
[code:1kn1a63p]data yours(drop=rc bp bq sp sq);
if _n_=0 then set a(obs=3);
if _n_=1 then do;
declare hash h(dataset:"a",ordered:"a");
h.definekey('time');
h.definedata('bp1','bq1','sp1','sq1');
h.definedone();
end;
h.output(dataset:'d');
declare hiter iter("h");
rc=iter.first();
do until(last);
set c(rename=(bp1=bp bq1=bq sp1=sp sq1=sq)) end=last;
if h.find()^=0 then output;
else do;
bp1=bp;
bq1=bq;
sp1=sp;
sq1=sq;
output;
rc=iter.next();
end;
end;
run;
[/code:1kn1a63p]
作者:
shiyiming
时间:
2011-7-14 17:10
标题:
Re: 时间不同檔合并上的问题?
先谢谢这个前辈的指教,先前有另一位前辈的指导,在此提供另一种方法和各位分享!
book为档案A
book1为档案B
读入方法和前面相同!
data test3;
merge book book1;
by date time;
order=_n_;
keep id date time bp1 bq1 ep1 eq1 cq order;
run;
proc sort data=test3;
by date descending order;
run;
data test4;
set test3;
by date descending order;
retain time1 bp2 bq2 ;
if ^missing(bp1) then do;
time1=time;
bp2=bp1;
bq2=bq1;
end;
else do;
time=time1;
bp1=bp2;
bq1=bq2;
end;
drop time1 bp2 bq2 ;
run;
proc sort data=test4 out=wanted(drop=order) ;
by order;
run;
作者:
shiyiming
时间:
2011-7-14 19:54
标题:
Re: 时间不同檔合并上的问题?
楼上给的这小段代码中,红色标记部分应该多余了,不然time字段观测有误,楼主不知道是不是这样,注意到这个小问题没!
data test4;
set test3;
by date descending order;
retain [color=#FF0000:1sgikxri]time1[/color:1sgikxri] bp2 bq2 ;
if ^missing(bp1) then do;
[color=#FF0000:1sgikxri] time1=time;[/color:1sgikxri]
bp2=bp1;
bq2=bq1;
end;
else do;
[color=#FF0000:1sgikxri]time=time1;[/color:1sgikxri]
bp1=bp2;
bq1=bq2;
end;
drop [color=#FF0000:1sgikxri]time1[/color:1sgikxri] bp2 bq2 ;
run;
欢迎光临 SAS中文论坛 (http://mysas.net/forum/)
Powered by Discuz! X3.2