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