SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 2664|回复: 12
打印 上一主题 下一主题

求助:对齐两个数据集

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2008-7-10 16:40:06 | 只看该作者

求助:对齐两个数据集

两个很大的数据集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
.
.
.


达人们我该怎么做阿?
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2008-7-10 18:17:47 | 只看该作者

Re: 求助:对齐两个数据集

两个表date 和time 能绝对的一一对应起来  这句话什么意思啊?没明白你要做什么呢。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 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语句,但我也不熟练。所以,只能写写一个,糊弄一下。如果数据集合非常大的话,就不行了。希望对你有用。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2008-7-10 21:47:14 | 只看该作者

Re: 求助:对齐两个数据集

如挂表格的日期时间本来在两个表格里面都是唯一的那就可以一一对应。否者就不一定一一对应,观测数也不同。不同的值就是那些重复的值引起的。 <!-- s:D --><img src="{SMILIES_PATH}/icon_biggrin.gif" alt=":D" title="Very Happy" /><!-- s:D -->
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2008-7-10 22:38:57 | 只看该作者

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;
不知道这样理解对不对?
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2008-7-10 22:43:03 | 只看该作者

Re: 求助:对齐两个数据集

另外 xgghxkhuang ,
date2=mdy(scan(date,2,&quot;-&quot;),scan(date,3,&quot;-&quot;),put(scan(date,1,&quot;-&quot;),4.));
time2=hms (scan(time,1,&quot;:&quot;),scan(time,2,&quot;:&quot;),00);
你是不是想把date和time转化成数值?用sas的input函数就可以了
date2=input(date,yymmdd10.);
time2=input(time,time5.);
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
7#
 楼主| 发表于 2008-7-11 08:59:54 | 只看该作者

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 -->
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
8#
 楼主| 发表于 2008-7-11 12:12:24 | 只看该作者

Re: 求助:对齐两个数据集

这个意思就是说:
1. 如果date time 相同,但是value不同,则此记录也是不同的。
2.如果一张表中有重复值,则重复值保留。

hash表会点,下午正好没事,试试。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
9#
 楼主| 发表于 2008-7-11 13:04:16 | 只看该作者

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:( --> 也就是说如果时间是唯一的,就可以用自然连接,否则会出现笛卡尔冗余。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
10#
 楼主| 发表于 2008-7-11 15:07:10 | 只看该作者

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;

还是习惯拥这些东西。
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2026-2-5 01:31 , Processed in 0.078630 second(s), 21 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表