查看原文
其他

软件应用 | 神奇的组内交叉合并

数据Seminar 2022-12-31

本文转载自公众号Stata and Python数据分析


导读

Hello,大家好呀!小编今天给大家带来Stata中一个好用的命令——joinby。当我们进行数据的横向合并时,经常会用到merge命令,但是在使用merge命令进行一对一合并、一对多合并、多对一合并和多对多合并都不是我们想要的结果时,可以考虑使用joinby组内交叉合并。老规矩,还是先上命令语法和选项介绍。

Part1命令介绍

1命令语法

joinby [varlist] using filename [, options]

2选项介绍

  • update:当master数据集中存在缺失值时,指定此选项可以使得using数据集中的非缺失值对其进行更新覆盖。

  • replace:这个选项只能与update一起使用。当指定此选项时,master数据集中的非缺失值将被using数据集的相应值替换。但是一个非缺失的观测值不会被一个缺失的观测值替换。

  • unmatched():当观测值不匹配时,指定此选项可以保留一个数据集的观测值。unmatched(none)表示忽略所有不匹配的观测值;unmatched(both)表示同时保留master和using数据集的不匹配的观测值;unmatched(master)表示仅保留master数据集中不匹配的观测值;unmatched(using)表示仅保留using数据集中不匹配的观测值。

  • _merge(varname):使用此选项可以标记合并结果中观测值的来源,默认为_merge。

  • nolabel:这个选项可以防止Stata直接从using数据集复制值标签到master数据集。

Part2案例应用

看完命令介绍,下面我们就小试牛刀,使用案例来看看joinby的具体用法吧!

首先,我们使用input命令生成两个具有公共变量id的数据集,然后使用joinby进行组内交叉合并,具体程序如下:

clear all
input id str3 v1
"a"
"b"
"c"
"d"
end
save 1.dta, replace
clear
input id str3 v2
"f"
"g"
"h"
"i"
"j"
end
save 2.dta, replace
joinby id using 1.dta //使用id变量进行合并
list

合并结果如下:我们可以看到,使用input命令生成的两个数据集内有分组,在使用joinby命令时,按分组对数据进行交叉合并。

接下来,我们再来用一个小例子来看看joinby命令的update选项的具体用法。首先还是使用input命令生成两个具有公共变量name的数据集,然后再通过joinby进行组内交叉合并,同时比较使用和不使用update选项的区别,具体程序如下:

clear all
input str8 name English
"Jane"  88
"Bob"  .
"Betty"  90
"Jack"  98
end
list
save eng1.dta, replace
clear
input str8 name English
"Jane"  .
"Bob"  95
"Betty"  90
"Jack"  98
end
list
save eng2.dta, replace

以name为合并依据进行组内交叉合并,不使用update选项:

joinby name using eng1.dta

使用update选项时,using数据集中的非缺失值将对master数据集中的缺失值进行覆盖更新。

joinby name using eng1.dta, update

从运行结果来看,当不加update选项时,只保留匹配成功的数据,并且在默认情况下保留master数据集的值;当加上update选项时,master数据集中的缺失值会被using数据集中的非缺失值覆盖更新借助上面的小例子,我们再来看看unmatched()_merge(varname)选项的用法。具体命令如下:

joinby name using eng1.dta, unmatched(master) _merge(_merge)

运行结果如下:从运行结果可以看到,当master数据集中的数据与using数据集中的数据冲突时,指定unmatched(master)选项可以只保留master数据集中不匹配的观测值。

最后,我们使用删除上市公司在停复牌期间的事件作为一个综合案例进行说明。下面两张图中的数据分别表示事件列表和停复牌日期。同一公司可能有多个事件,也可能发生多次停牌,只要某个事件,在任一停复牌期间内,就删除该事件。因此,对同一公司的每一个事件都与该公司所有的停复牌日期进行组内交叉合并,找到在停复牌时期内发生的事件,然后再将这些事件与事件列表进行横向合并,最后只保留非停复牌日期内的事件。具体程序如下:

use 事件列表,clear
joinby stkcd using 停复牌
gen date1 = date(date,"YMD")
gen num = 1 if date1 >= startdate & date1 <= enddate
keep if num == 1
merge 1:1 stkcd date using 事件列表
keep if _m == 2
keep stkcd date

运行结果如下:





星标⭐我们不迷路!
想要文章及时到,文末“在看”少不了!

点击搜索你感兴趣的内容吧


往期推荐


数据资源 | 建议收藏!写论文时有哪些非常神的网站?

共庆祖国华诞,CCAD喜送福利!

软件应用 | 7种主流数据分析软件以及经典教材推荐

软件应用 | 你的“老”文献、手写笔记有多少可以识别和复制?快用python批量转化吧!

统计计量 | 稳健性检验的套路:学会后即可一招鲜,吃遍天吗?

热点资讯 | 新华社公布新增57个禁用词,三思而后言

软件应用 | 哇!Stata参考书和经典教材!






数据Seminar




这里是大数据、分析技术与学术研究的三叉路口


推荐 | 青酱


    欢迎扫描👇二维码添加关注    

点击下方“阅读全文”了解更多

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存