3014 3

[数据管理求助] stata如何先用一个变量匹配,没匹配上的再用另一个变量进行merge [推广有奖]

  • 0关注
  • 0粉丝

硕士生

17%

还不是VIP/贵宾

-

威望
0
论坛币
1494 个
通用积分
43.6731
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
282 点
帖子
27
精华
0
在线时间
232 小时
注册时间
2019-7-7
最后登录
2025-1-21

楼主
萌萌的窗边的小豆豆 发表于 2021-12-17 21:37:59 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币

stata如何先用一个变量匹配,没匹配上的再用另一个变量进行merge

求问大家,在merge A和B两个库的时候,先用ID1进行merge,结果有一部分A没有匹配上。然后就想到用ID2来进一步merge,把这部分没匹配上的匹配上。请问这个逻辑怎么实现呢?就比如:

数据库A
id1 id2 sells
1   11   4
1   11   5
1   11   6
2   22   3
2   22   3
3   33   4
3   33   2
数据库B
id1 id2 costs
1   11   0.2
2   .    0.3
.   33   0.4

最后期望得到的是
id1 id2 sells costs
1   11   4     0.2
1   11   5     0.2
1   11   6     0.2
2   22   3     0.3
2   22   3     0.3
3   33   4     0.4
3   33   2     0.4

谢谢!

二维码

扫码加我 拉你入群

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

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

关键词:Merge Stata tata costs sells

沙发
我是小肚肚 发表于 2021-12-18 02:00:19
数据库B拆成两块,记数据库B为 data_B.dta
use data_B, clear
preserve
drop id2
save part1
restore
drop id1
rename costs costs_2
save part2

再分别merge到主表 data_A.dta
use data_A, clear
merge 1:1 id1 using part1
drop if _m == 2
drop _m
merge 1:1 id2 using part2
drop if _m == 2
drop _m
replace costs = costs_2 if costs == .
*id1没匹配到的空值 costs用 id2匹配上的 costs_2 替换
这样应该就行了
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
Sunknownay + 3 + 3 + 3 热心帮助其他会员

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

藤椅
wdlbcj 学生认证  发表于 2021-12-18 10:04:17
第一步 用ID1匹配 没匹配上的那部分删除
第二步用剩下的 以ID2匹配
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
Sunknownay + 3 + 3 + 3 热心帮助其他会员

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

板凳
黃河泉 在职认证  发表于 2021-12-18 14:40:31
Clyde Schechter 建议 (请先 ssc install frameappend):
  1. * Example generated by -dataex-. For more info, type help dataex
  2. clear*
  3. input float(id1 id2 sells)
  4. 1 11 4
  5. 1 11 5
  6. 1 11 6
  7. 2 22 3
  8. 2 22 3
  9. 3 33 4
  10. 3 33 2
  11. end
  12. tempfile A
  13. save `A'

  14. * Example generated by -dataex-. For more info, type help dataex
  15. clear
  16. input float(id1 id2 costs)
  17. 1 11 .2
  18. 2  . .3
  19. . 33 .4
  20. end
  21. tempfile B
  22. save `B'

  23. use `A', clear
  24. merge m:1 id1 using `B', keep(master match)
  25. frame put _all if _merge == 3, into(matched)
  26. drop if _merge == 3
  27. drop _merge
  28. merge m:1 id2 using `B', update keep(master match match_update) nogenerate

  29. frame change matched
  30. frameappend default
复制代码
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
Sunknownay + 3 + 3 + 3 热心帮助其他会员

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

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

本版微信群
加好友,备注jltj
拉您入交流群
GMT+8, 2026-1-9 12:45