楼主: amanda8901
3419 8

[问答] 请教一个match and merge的问题 [推广有奖]

  • 0关注
  • 0粉丝

初中生

42%

还不是VIP/贵宾

-

威望
0
论坛币
84 个
通用积分
0.0020
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
678 点
帖子
26
精华
0
在线时间
1 小时
注册时间
2008-12-1
最后登录
2016-5-4

楼主
amanda8901 发表于 2011-2-8 12:38:55 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
有两个data sets A 和B 各含有两个变量,其中一个变量有相同的名字。
data set A:                 data set B:
X Y                             X Z
1 red                           1 brown
1 blue                          1 red                           
3 yellow                       2 yellow
3 green                        3 red
                                    3 pink

问题是这样的。对于相同的X值,如果Y和Z至少有一个值相同,就执行操作M,否则执行操作N。

我不知道有没有什么简单的方法可以实现,我自己的想法是把A和B 通过X merge起来,对于同一个X值下,把Y和Z所以可能的组合都表示出来,然后生成一个新的变量,表示它们是否有值相同。具体说,就是我想生成如下的新dataset C :

X   Y         Z               flag
1   red      brown       0
1   red      red            1
1   blue     brown       0
1   blue     red            0
3   yellow  red            0
3   yellow  pink           0
3   green   red            0
3   green   pink           0

但是我用 PROC MERGE却没有得到我想要的结果,而且即使生成了如上的data set,接下来又怎么做呢?恳请大家帮忙,谢谢 :)
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:Match Merge ATCH ATC Mat 请教 Merge Match

沙发
hssnow 发表于 2011-2-8 16:15:27
  1. proc sql noprint;
  2.         create table c as
  3.         select distinct a.x as x_id
  4.         from a,b
  5.         where a.x=b.x and a.y=b.z;
  6. quit;
复制代码
这样可以得到 y 和 z 至少有一个相同的 x 值,不知道你的 M 和 N是什么,根据实际情况再进一步处理就可以了吧,呵呵~
My Blog: http:/hssnow.name/
宁静致远

藤椅
baoaibaobao 发表于 2011-2-8 19:41:01
数据集C是很容易得到的,现在的问题是操作M和N指的是什么,我的理解你这个操作应该是针对Y和Z至少有一个值相同时候的X进行的,所以第一步应该是先区分符合与不符合条件的X
  1. data A;                 
  2. input X Y$;
  3. cards;
  4. 1 red
  5. 1 blue
  6. 3 yellow
  7. 3 green
  8. ;
  9. data B;
  10. input X Z$;
  11. cards;
  12. 1 brown
  13. 1 red
  14. 2 yellow
  15. 3 red
  16. 3 pink
  17. ;
  18. proc sql;
  19.         create table c as
  20.         select *
  21.                 ,case when a.y=b.z then 1 else 0 end as flag
  22.                 ,sum(calculated flag) as sum_flag
  23.         from a,b
  24.         where a.x=b.x
  25.         group by a.x;
  26. quit;
复制代码
代码中的sum_flag不符合条件就为0,否则为非零,它的数值大小表示在同一个X中,有几个符合条件的观测。

板凳
amanda8901 发表于 2011-2-9 10:02:16
M 和 N  是已经编辑好的macro, 直接调用就可以了,所以倒不是问题。我主要是不知道怎么定义调用它们的条件,呵呵。非常感谢hssnow和baoaibaobao的回复

还想请教的是,如果不用proc sql,只用data step是否也能产生这样的新数据集呢?

报纸
hssnow 发表于 2011-2-10 13:12:41
4# amanda8901
呵呵,纯 data 步的我没想出比较好的,也得用proc sql生成一组宏变量,结合宏再去做。。。
My Blog: http:/hssnow.name/
宁静致远

地板
hssnow 发表于 2011-2-11 10:26:32
呵呵,之前思维定势啊,走偏了...crackman前辈的一篇博文 http://crackman.net/?p=1194 ,给出了一种处理数据集合并的方法,刚好可以应用在这里,如下:
  1. data c;
  2.         set a;
  3.         do i=1 to num;
  4.                 set b(rename=(x=x2)) nobs=num point=i;
  5.                 output;
  6.         end;
  7. run;
  8. data c_new(drop=x2);
  9.         set c;
  10.         if x ne x2 then delete;
  11.         if y=z then flag=1;
  12.                 else flag=0;
  13. run;
复制代码
My Blog: http:/hssnow.name/
宁静致远

7
amanda8901 发表于 2011-2-11 10:53:39
请问一下hssnow do i=1 to num里的num是哪里来的。。。

想到另外一种方法 还没来得及试验下 我想用sort nodupkey在第一个数据集上 然后和第二个数据集merge 现在这个电脑上没有sas 所以不知道行不行得通 等试验过后再来和大家分享

非常感谢各位高手的回复

8
hssnow 发表于 2011-2-11 11:17:06
7# amanda8901
num是由 nobs= 赋值得到的,是临时变量,nobs 表示 number of the observation,在数据集编译时产生。
My Blog: http:/hssnow.name/
宁静致远

9
pinseng 发表于 2011-2-11 13:07:44
6# hssnow

不错不错  学习了  哈哈

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-9 08:42