楼主: 吕小布韦
2587 12

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

11
pobel 在职认证  发表于 2013-7-30 13:42:16
吕小布韦 发表于 2013-7-30 13:25
那,这个问题是怎么产生的呢?不是说merge语句会用后面一个数据集的变量覆盖掉前面一个数据集的。
这种情况是在进行多对一或一对多merge时很容易忽略的。
楼主的例子中merge数据集D和C时属于多对一merge。这里的关键一点在于,SAS对于C中的每条记录只会读取一遍。以a=2, sex=1为例,SAS的读取过程是这样的:
1.
a. 读取数据集D的第4条记录,PDV中变量b的值为空值;
b. 读取数据集C的第1条记录,PDV中变量b的值被C中变量b的值676覆盖;
c. OUTPUT

2.
a. 读取数据集D的第5条记录,PDV中变量b的值676被新读入的空值覆盖;
b. OUTPUT (这里不会再次读取数据集C中的记录,因为C中只有一条满足a=2,sex=1的记录);

3. 同2,会读入数据集D的第六条记录,新读入的变量b的空值覆盖原来的空值,然后OUTPUT;

楼主所说的后面数据集的变量值覆盖前面数据集的变量值,只有在SAS对这两个数据集同时读取的时候才会发生,如一对一,多对多的merge。而多对一的merge,因为对于每一组,后面的"一"只会读取一次,所以也就只会“覆盖”一次。
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
吕小布韦 + 1 + 1 + 1 精彩帖子

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

和谐拯救危机

12
吕小布韦 发表于 2013-7-31 08:11:50
pobel 发表于 2013-7-30 13:42
这种情况是在进行多对一或一对多merge时很容易忽略的。
楼主的例子中merge数据集D和C时属于多对一merge。 ...
谢谢了!茅塞顿开!

13
jolterheadmmtt 发表于 2013-8-13 14:54:57
pobel 发表于 2013-7-30 12:51
data e;
     merge d  c(rename=(b=b_in_c));
     by a sex;
我也想问这个问题,为什么lz那么写不行?merge为什么只覆盖了第一行观测?
谢谢大神指教啊

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

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