SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 716|回复: 5
打印 上一主题 下一主题

重合数据的问题

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2010-2-5 00:28:25 | 只看该作者

重合数据的问题

我有两个数据集a和b,数据格式大概为com date trade,我想比较一下两个数据集有多少交叉的部分。

我先把每个数据集中加了source,然后把两个数据集combine起来了
data ab; set a b; by com date; run;

组合的数据集形式大概如下:
com date            trade source
A    20060201       5        a
A    20060201       6        b
A    20070502       2        a
A    20070502       2        a
A    20070503       3        b
A    20080101       5        a
A    20080101       5        b
B    20070101       2        b
C    20060101       6        a
D     ...

我现在想知道:
1,每年中有多少com在数据a中,有多少com在数据b中,有多少com既在a中又在b中;(前面两个比较容易得到,这个交集怎么得到?有没有直接的函数?)
上面ABC三家公司的例子里面应该得到:
Year  a   b   both
2006  2   1   1
2007  1   2   1
2008  1   1   1

2,两个数据集中有多少重合的数据,比如:
A    20080101       5        a
A    20080101       5        b
这两个obs就是重合的数据,如何把这些重合的数据单独输出?
我考虑过按com date trade排序后用if first.trade ne last.trade; 输出,但是有一个问题,我的数据里面同一个source的也有可能有重复的数据,比如:
A    20070502       2        a
A    20070502       2        a
如何能保证只输出不同数据集的重复?

一团浆糊了,还请大牛们指教一二!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2010-2-5 08:50:20 | 只看该作者

Re: 重合数据的问题

[quote:1ktwv6t0]据里面同一个source的也有可能有重复的数据,比如:
A 20070502 2 a
A 20070502 2 a
[/quote:1ktwv6t0]
对于你来说重要吗?如果不重要可以先把重复的删除掉,然后再进行你所说的运算,应该对于实现你的要求就简单多了。
删除重复记录的方法可以用proc sort步中的nodup选项,如下例:
[code:1ktwv6t0]data raw;
        input com $ date $ trade source $;
        datalines;
A 20060201 5 a
A 20060201 6 b
A 20070502 2 a
A 20070502 2 a
A 20070503 3 b
A 20080101 5 a
A 20080101 5 b
B 20070101 2 b
C 20060101 6 a

;
run;

proc sort data=raw out=temp nodup;
by com date trade source;
run;
[/code:1ktwv6t0]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2010-2-5 13:14:50 | 只看该作者

Re: 重合数据的问题

这个重复数据也是有用的,可能是一天多次trade产生的,其实我主要想知道两个数据集有多大的差异。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2010-2-5 17:39:38 | 只看该作者

Re: 重合数据的问题

看来问题太复杂了?:(

那么只是把同一天内既有来自a的也有来自b的这样的数据输出呢?
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2010-2-6 00:40:14 | 只看该作者

Re: 重合数据的问题

[code:2lvtqqig]data x;
input com $ date yymmdd8. trade source $;
year = year(date);
format date yymmdd10.;
cards;
A 20060201 5 a
A 20060201 6 b
A 20070502 2 a
A 20070502 2 a
A 20070503 3 b
A 20080101 5 a
A 20080101 5 b
B 20070101 2 b
C 20060101 6 a
C 20060101 6 b
;

proc sql;
        create table y1 as select year, source, count(distinct com) as inSource from x group by year, source;
        create table y2 as select year, count(com) as both from (select year, com from x group by year, com having count(distinct source) > 1) group by year;
quit;
proc transpose data = y1 out = y11(drop = _name_);
        by year; id source;
        var inSource;
run;
data y;
        merge y11 y2; by year;
        if missing(a) then a = 0; if missing(b) then b = 0; if missing(both) then both = 0;
run;
proc print; run;[/code:2lvtqqig]

I don't see why I am doing that. JingJu
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2010-3-10 06:33:30 | 只看该作者

Re: 重合数据的问题

before you use data set to concatenate dataset a and b:

proc sort data=a; by com  date trade; run;
proc sort data=b; by com  date trade; run;

data both2; merge a(in=ina) b(in=inb); by com  date trade;
if ina and not inb then onlyina=1; if ina and inb then inboth=1;if inb and not ina then onlyinb=1;
run;
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-3 16:00 , Processed in 0.194820 second(s), 21 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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