请选择 进入手机版 | 继续访问电脑版
楼主: 奇迹曼德拉
3017 1

[技术讨论与投票] 一对多合并时相同变量的覆盖问题 [推广有奖]

  • 0关注
  • 0粉丝

高中生

37%

还不是VIP/贵宾

-

威望
0
论坛币
9 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
132 点
帖子
8
精华
0
在线时间
40 小时
注册时间
2014-4-18
最后登录
2020-5-25

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
举个例子,用by id 来一对多合并。
data a;
input id sex$ subject$ score;
cards;
1 m math 100
1 m chinese 99
2 m math 88
2 m chinese 76
;
run;

data b;
input id sex$ age;
cards;
1 f 13
2 f 12
;
run;

data all;
merge a b;
by id ;
run;
因为性别在两个数据集中都存在,应该是后一个数据集b中的性别覆盖掉a中的性别。又因为a中每个id又两条记录,所以b的结果应该重复两次。
我期望的结果是这样的:
id sex score age
1 f math 100 13
1 f chinese 99 13
2 f math 88 12
2 f chinese 76 12
实际的结果却是这样的
id sex score age
1 f math 100 13(第一条记录的性别被b中的覆盖)
1 m chinese 99 13(第二条记录中的性别没有被b覆盖,保留了a中原有的性别)
2 f math 88 12
2 m chinese 76 12

为什么会出现这种结果呢?分数是b中独有的变量,合并之后重复了两次没有问题。
但是性别作为在A中已经存在的变量,为什么一次被b覆盖,一次没有呢?如果想要两次都被B覆盖怎么办?
二维码

扫码加我 拉你入群

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

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

关键词:一对多 Chinese Subject score cards

steven_1017 发表于 2019-1-25 02:19:32 |显示全部楼层 |坛友微信交流群
merge statement的运行,是按照它的by variable进行分组的。以你的程序为例,以id分组,id为1的时候,a中的1 m math 100,1 m chinese 99与b中的1 f 13为一组。merge分组之后,在PDV里面开始读入和写出,其中一个性质为,同一组内往PDV中放的时候,不会进行re-initialization,也就是PDV输出一个obs之后,并不会把PDV中的数据清除。当一组全部输出完毕,进入第二组时,才会清零。

在PDV中的运行机制,就以你的程序为例:
第一步,初始化阶段,PDV构架如下:
id     sex     subject     score     age
第二步,将a中第一组id (id=1的那一组)的第一个obs读入
id     sex     subject     score     age
1      m       math        100       .
第三步,将b中第一组id 的第一个obs读入,有相同variable name的就会覆盖,例如sex就会覆盖,age的missing值会被更新
id     sex     subject     score     age
1      f         math        100       13
自此,新数据集all的第一个obs产生并输出到all里面。由于上面也说过,merge在同一个组内,读出第一个obs到新合并数据集后,PDV不会被re-initialized,所以第三步中的全部数据,将会被保留,然后开始下面的读取。
第四步,将a中第一组id的第二个obs读入,sex会被覆盖为m(这个就是你疑问所在),math会被覆盖为chinese,score会被覆盖为99。
id     sex     subject     score     age
1      m       chinese        99       13
由于b中没有第二个obs,而b的第一个obs并不参与all第二个obs的构建,仅仅是age在PDV里面被retain为13,所以这个就作为all的第二个obs输出。自此,merge的第一组id过程完成。然后进入第二组id的merge,此时PDV会进行re-initialization,里面的值都会被清除,便于开始读取第二组id的内容,过程与上面描述一样。

要想知道merge的过程,还是需要仔细研究一下PDV的运作机制,希望这个回答能够对楼主有所帮助。
已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
admin_kefu + 50 + 5 + 5 + 5 热心帮助其他会员

总评分: 论坛币 + 50  学术水平 + 5  热心指数 + 5  信用等级 + 5   查看全部评分

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-19 08:09