标题: 求助:对齐两个数据集 [打印本页] 作者: shiyiming 时间: 2008-7-10 16:40 标题: 求助:对齐两个数据集 两个很大的数据集A和B,变量包括 date, time, value
两个表都是根据日期时间顺次排列的,
两个表中绝大部分date 和 time 是相同的, 但是有少部分不一样, 因此总观测数量也有出入
现在需要把日期时间不相同的观测剔除,使得更新后的两个表date 和time 能绝对的一一对应起来,
example:
表A:
date time value
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
.
.
.
表B:
date time value
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
.
.
.
达人们我该怎么做阿?作者: shiyiming 时间: 2008-7-10 18:17 标题: Re: 求助:对齐两个数据集 两个表date 和time 能绝对的一一对应起来 这句话什么意思啊?没明白你要做什么呢。作者: shiyiming 时间: 2008-7-10 21:41 标题: 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语句,但我也不熟练。所以,只能写写一个,糊弄一下。如果数据集合非常大的话,就不行了。希望对你有用。作者: shiyiming 时间: 2008-7-10 21:47 标题: Re: 求助:对齐两个数据集 如挂表格的日期时间本来在两个表格里面都是唯一的那就可以一一对应。否者就不一定一一对应,观测数也不同。不同的值就是那些重复的值引起的。 <!-- s:D --><img src="{SMILIES_PATH}/icon_biggrin.gif" alt=":D" title="Very Happy" /><!-- s:D -->作者: shiyiming 时间: 2008-7-10 22:38 标题: Re: 求助:对齐两个数据集 是不是可以理解为取表A和表B的交集,然后将A和B中不在交集中的数据删除?
data a;
input date :yymmdd10. time : time5. 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
data b;
input date :yymmdd10. time : time5. 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 a b;
merge a(in=in1) b(in=in2);
by date time;
if in1 and in2 then output a b;
run;
不知道这样理解对不对?作者: shiyiming 时间: 2008-7-10 22:43 标题: Re: 求助:对齐两个数据集 另外 xgghxkhuang ,
date2=mdy(scan(date,2,"-"),scan(date,3,"-"),put(scan(date,1,"-"),4.));
time2=hms (scan(time,1,":"),scan(time,2,":"),00);
你是不是想把date和time转化成数值?用sas的input函数就可以了
date2=input(date,yymmdd10.);
time2=input(time,time5.);作者: shiyiming 时间: 2008-7-11 08:59 标题: Re: 求助:对齐两个数据集 data a;
format date yymmdd10.;
format time time5.;
input date :yymmdd10. time : time5. 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;
format date yymmdd10.;
format time time5.;
input date :yymmdd10. time : time5. value2;
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
2008-6-25 11:30 6
;
run;
data a(drop=value2) b(drop=value);
merge a(in=in1) b(in=in2);
by date time;
if in1 and in2 then output a b;
run;
1.我是找了半天,也没有从帮助(sas online doc)和 我的9.1.3的帮助中找到合适的函数,才写一个凑合的 <!-- s:) --><img src="{SMILIES_PATH}/icon_smile.gif" alt=":)" title="Smile" /><!-- s:) --> ,能教一下我如何快速寻找到要用的格式。我是用 time informat 来查的,但是效果并不好。
2.你写的代码比我好一点,只是有点小问题。a。如果value在两张表格中不同,可是用您的语句查出来值被覆盖了。
b.如果表格之一有重复值(b表我加了一条),那么在a表格应该差到的条数比b表格少一条。如果,本来两表格中的时间(相同的时间)都是唯一的,那代码就对了。但是,如果有重复的时间,那么两表格查出来的条数有可能不一样。
比如上面的数据集合a应该四条,b应该五条。
3.这里它的难点,在于两张表格都很大。不知道哪位大侠,能写出执行效率高的代码。否者,一运行就死机了。不知道哪位大侠会用hash表格的能写一下,大家分享。
4.谢谢你的那两个格式,我将它保存下来了。 <!-- s:D --><img src="{SMILIES_PATH}/icon_biggrin.gif" alt=":D" title="Very Happy" /><!-- s:D -->作者: shiyiming 时间: 2008-7-11 12:12 标题: Re: 求助:对齐两个数据集 这个意思就是说:
1. 如果date time 相同,但是value不同,则此记录也是不同的。
2.如果一张表中有重复值,则重复值保留。
hash表会点,下午正好没事,试试。作者: shiyiming 时间: 2008-7-11 13:04 标题: Re: 求助:对齐两个数据集 假设a表格代表a表格在t时候的交易额度。b表格代表b的交易额度。
希望a表格交易的时间能在b交易的时间内找到。反之,b表格中的时间能在a表格中找到。
其他信息保留。
比如在t=1时候 a有2笔交易va1=1 va2=1,恰好b在t=1时候也有3笔交易vb1=2 vb2=3 vb3=3
那么在t=1时候的交易在两个各自表格中应该保存;
即 在删除后的表格中在t=1时候 a有2笔交易va1=1 va2=1,恰好b在t=1时候也有3笔交易vb1=2 vb2=3 vb3=3
如果t=2时候a中有交易而b中没有,删除a中t=2的交易。反之,t=2时候b中有交易而在a中没有删除b中的交易。
<!-- s:( --><img src="{SMILIES_PATH}/icon_sad.gif" alt=":(" title="Sad" /><!-- s:( --> 也就是说如果时间是唯一的,就可以用自然连接,否则会出现笛卡尔冗余。作者: shiyiming 时间: 2008-7-11 15:07 标题: Re: 求助:对齐两个数据集 data c;
merge a(in=in1) b(in=in2);
by date time;
if in1 and in2 then output /*两张表中的公共数据*/
run;
proc sort data=c nodupkey;
by date time;
run;
data a;
merge a(in=in1) c(in=in2);
by date time;
if in1 and in2 then ouput;
run;
data b;
merge b(in=in1) c(in=in2);
by date time;
if in1 and in2 then output;
run;
还是习惯拥这些东西。作者: shiyiming 时间: 2008-7-11 15:39 标题: Re: 求助:对齐两个数据集 两个数据集都狂大,里面都不会出现重复的情况,就是说 date 加上 time 可以确定唯一对应的value值;
琢磨了半天, 我已经用 sql 的办法搞掂了,
谢谢各位达人的帮助,^_^!!作者: shiyiming 时间: 2008-7-27 08:56 标题: Re: 求助:对齐两个数据集 很简单啊,搞那复杂干什 <!-- s:lol: --><img src="{SMILIES_PATH}/icon_lol.gif" alt=":lol:" title="Laughing" /><!-- s:lol: -->
data a;
input date yymmdd10. time1 time5. value1;
format date yymmdd10.;
format time1 time5.;
datalines;
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;
input date yymmdd10. time2 time5. value2;
format date yymmdd10.;
format time2 time5.;
datalines;
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 combine;
set a;
set b;
if time1=time2;output;
run;
proc print data=combine;
run;作者: shiyiming 时间: 2008-8-15 19:27 标题: Re: 求助:对齐两个数据集 楼上的不对吧,按你程序,只要相同的记录不在同一行就不会被输出的!!1