|
|
板凳

楼主 |
发表于 2008-7-10 21:41:24
|
只看该作者
Re: 求助:对齐两个数据集
data a;
length date $10. time $5.;
input date $ time $ value;
cards;
2008-6-25 9:30 2
2008-6-25 10:40 5
2008-6-25 10:50 5
2008-6-25 11:20 3
2008-6-25 11:30 6
;
run;
data b;
length date $10. time $5.;
input date $ time $ value;
cards;
2008-6-25 9:30 2
2008-6-25 10:40 5
2008-6-25 11:20 6
2008-6-25 11:25 6
2008-6-25 11:30 6
;
run;
data ac;
set a;
date2=mdy(scan(date,2,"-"),scan(date,3,"-"),put(scan(date,1,"-"),4.));
time2=hms (scan(time,1,":"),scan(time,2,":"),00);
dhms2=dhms (date2,scan(time,1,":"),scan(time,2,":"),00);
format date2 date9.;format time2 time.;format dhms2 DATETIME.;
run;
data bc;
set b;
date2=mdy(scan(date,2,"-"),scan(date,3,"-"),put(scan(date,1,"-"),4.));
time2=hms (scan(time,1,":"),scan(time,2,":"),00);
dhms2=dhms (date2,scan(time,1,":"),scan(time,2,":"),00);
format date2 date9.;format time2 time.;format dhms2 DATETIME.;
run;
proc sql;
create index dhms2
on ac(dhms2);
create index dhms2
on bc(dhms2);
delete * from ac
where ac.dhms2 not in (select bc.dhms2 from bc);
delete * from bc
where bc.dhms2 not in (select ac.dhms2 from ac);
quit;
比较笨,虽然用了索引,但还是效率不高的。因为相当于做一次m*n次的比较。如果用hash表格方法,只要做大概max(m.n)
次的选择。算法是将两张表格先按照dhms2排序每次取依照升序的顺序从a表格中提取一个观测,然后和b中的比较如果小于取
b的下一个观测,同时num增加1,num代表b中的第n个观测,就是指针。如果遇到一个等号那就跳出循环,并且计入num的值,
如果没有遇到等号,遇到第一个大于号时候,删除a中的这个观测,num计入这次num值等于num-1或者num,
然后由循环从表格中读入表格a中的下一个较大的观测值,这里是关键将a的变量直接和b中的第num个值比较这样每次可以少比较mun-1个观测,再由ba做一次 ,只要做2*max(m,n)次就可以了。
可惜,data部好像不行,我试过point,不行。hash表格我不会。但是好像还有可以直接对数据集合读写的fopen语句,但我也不熟练。所以,只能写写一个,糊弄一下。如果数据集合非常大的话,就不行了。希望对你有用。 |
|