[原创]stata合并数据集详细举例(merge)

这里只有作者精心编写的研究经历!
回复
头像
hellohappy
网站管理员
网站管理员
帖子: 269
注册时间: 2018年11月18日, 14:27
Been thanked: 1 time

#1 [原创]stata合并数据集详细举例(merge)

未读文章 hellohappy » 2019年4月04日, 21:16

前言:
    一般来说,用到stata进行数据合并,都应该是用1:1合并,这才能一一对应,所以,非一一对应的合并我就不说了。免得混乱。
    一般来说,善用生成的 _merge 变量来删除不要的匹配,再加上知道下面的几种情况怎么匹配,基本上已经够用了。
下面是的例子。

例子1:

    我有一个数据集1(文件名字为1.dta),他长这样(其中数据的内容我随便填的):
例子1数据集1.png
例子1数据集1.png (12.12 KiB) 查看 412 次
例子1数据集1.png
例子1数据集1.png (12.12 KiB) 查看 412 次

    我还有一个数据集合2(文件名字为2.dta),他长这样:
例子1数据集2.png
例子1数据集2.png (7.69 KiB) 查看 412 次
例子1数据集2.png
例子1数据集2.png (7.69 KiB) 查看 412 次

    显然上面两个数据集合就是个面板数据,我想要合并他们,变成下面这样:
例子1合并后.png
例子1合并后.png (14.99 KiB) 查看 412 次
例子1合并后.png
例子1合并后.png (14.99 KiB) 查看 412 次

    我要怎么做呢?
        首先分析一下,用什么指标能唯一地识别出一个数据?显然,对应上面这个面板数据,用year和id两个指标,就能唯一的指明某一条数据。所以我们应用year和id这个组合来进行匹配。(同样的,如果你的数据本身就是有唯一id,那就直接用这个唯一id来匹配,如果你的数据本身有多个维度才能唯一指定某一个数据,那你就需要多个变量的组合来匹配)
        然后,选择其中一个数据集合作为原本的数据集合。另一个数据集合就用来匹配,匹配成功后就加进原来数据集里面。
        比如这里把 1.dta 作为原数据集合。
        所以,上述的操作代码为:

Code: 全选

//加载数据集1.dta
use "C:\Users\Administrator\Desktop\1.dta"
//根据year id两个维度来匹配数据
merge 1:1 year id using "C:\Users\Administrator\Desktop\2.dta"
    然后就完成了!

例子2:

    我有一个数据集1(文件名字为1.dta),他长这样(其中数据的内容我随便填的):
例子2数据集1.png
例子2数据集1.png (14.67 KiB) 查看 411 次
例子2数据集1.png
例子2数据集1.png (14.67 KiB) 查看 411 次

    我还有一个数据集合2(文件名字为2.dta),他长这样:
例子2数据集2.png
例子2数据集2.png (7.7 KiB) 查看 411 次
例子2数据集2.png
例子2数据集2.png (7.7 KiB) 查看 411 次

    同样的我想要合并他们,变成下面这样:
例子1合并后.png
例子1合并后.png (14.99 KiB) 查看 412 次
例子1合并后.png
例子1合并后.png (14.99 KiB) 查看 412 次

    这一次和上面不一样的是,他们是互补的数据,你有我没有,我有你没有,我们只需要非空值。
    要合并这个方法很简单,加一个update选项就可以了。update的意思是,如果原来的数据集合该数据为空,那么就使用匹配数据集里面的非空数据替换掉空数据。

Code: 全选

//加载数据集1.dta
use "C:\Users\Administrator\Desktop\1.dta"
//根据year id两个维度来匹配数据
merge 1:1 year id using "C:\Users\Administrator\Desktop\2.dta",update

例子3:

    我有一个数据集1(文件名字为1.dta),他长这样:
例子3数据集1.png
例子3数据集1.png (14.8 KiB) 查看 410 次
例子3数据集1.png
例子3数据集1.png (14.8 KiB) 查看 410 次

    我还有一个数据集合2(文件名字为2.dta),他长这样:
例子3数据集2.png
例子3数据集2.png (9.35 KiB) 查看 410 次
例子3数据集2.png
例子3数据集2.png (9.35 KiB) 查看 410 次

    你会发现,数据集1和数据集2的 var3 变量里面,有一部分是重叠的如果你想要原数据集(也就是数据集1)作为正确的数据,也就是这个:
例子3合并后1.png
例子3合并后1.png (15.55 KiB) 查看 410 次
例子3合并后1.png
例子3合并后1.png (15.55 KiB) 查看 410 次

    你的代码就只需要跟例子2一样就行了。

Code: 全选

//加载数据集1.dta
use "C:\Users\Administrator\Desktop\1.dta"
//根据year id两个维度来匹配数据
merge 1:1 year id using "C:\Users\Administrator\Desktop\2.dta",update
    但是如果你认为匹配数据集(也就是数据集2)的数据才是正确的,也就是这样:
例子3合并后2.png
例子3合并后2.png (15.67 KiB) 查看 410 次
例子3合并后2.png
例子3合并后2.png (15.67 KiB) 查看 410 次

    你应该在update后面再加上replace。replace的意思是,当有冲突时候,使用匹配数据集的非空数据来替换原数据集的非空数据。

Code: 全选

//加载数据集1.dta
use "C:\Users\Administrator\Desktop\1.dta"
//根据year id两个维度来匹配数据
merge 1:1 year id using "C:\Users\Administrator\Desktop\2.dta",update replace
 

其实前面已经把stata的1:1匹配讲完了,如果你明白上面三个情况下怎么用,后面的例子应该也能明白怎么弄


例子4:

    我有一个数据集1(文件名字为1.dta),他长这样:
例子4数据集1.png
例子4数据集1.png (18.3 KiB) 查看 408 次
例子4数据集1.png
例子4数据集1.png (18.3 KiB) 查看 408 次

    我还有一个数据集合2(文件名字为2.dta),他长这样:
例子4数据集2.png
例子4数据集2.png (4.94 KiB) 查看 409 次
例子4数据集2.png
例子4数据集2.png (4.94 KiB) 查看 409 次

    合并后同样的,长这样:
例子1合并后.png
例子1合并后.png (14.99 KiB) 查看 412 次
例子1合并后.png
例子1合并后.png (14.99 KiB) 查看 412 次

    你会发现,这其实就是给原来的数据集1添加新的一年的数据:
    方法其实就是和例子2、例子3一样!包括是否用匹配数据覆盖原数据,加不加replace,都是一样的。

Code: 全选

//加载数据集1.dta
use "C:\Users\Administrator\Desktop\1.dta"
//根据year id两个维度来匹配数据
merge 1:1 year id using "C:\Users\Administrator\Desktop\2.dta",update

例子5:

    我有一个数据集1(文件名字为1.dta),他长这样:
例子5数据集1.png
例子5数据集1.png (10.95 KiB) 查看 407 次
例子5数据集1.png
例子5数据集1.png (10.95 KiB) 查看 407 次

    我还有一个数据集合2(文件名字为2.dta),他长这样:
例子4数据集2.png
例子4数据集2.png (4.94 KiB) 查看 409 次
例子4数据集2.png
例子4数据集2.png (4.94 KiB) 查看 409 次

    合并后同样的,长这样:
例子1合并后.png
例子1合并后.png (14.99 KiB) 查看 412 次
例子1合并后.png
例子1合并后.png (14.99 KiB) 查看 412 次

    你会发现,这个例子其实就是例子4删掉了year==2013时候的样子。
    所以这个怎么办啊?
        。。。这个就是例子1的变形。代码也一样

Code: 全选

//加载数据集1.dta
use "C:\Users\Administrator\Desktop\1.dta"
//根据year id两个维度来匹配数据
merge 1:1 year id using "C:\Users\Administrator\Desktop\2.dta"

Link:
Hide post links
Show post links

hufei_lt
帖子: 3
注册时间: 2019年8月19日, 07:03

#2 Re: [原创]stata合并数据集详细举例(merge)

未读文章 hufei_lt » 2019年8月19日, 07:06

您好 我尝试了最后一个例子,发现数据集合2的时间“2013”并没有加入到合并后的结果中。 请问您可以实现吗

Link:
Hide post links
Show post links

头像
hellohappy
网站管理员
网站管理员
帖子: 269
注册时间: 2018年11月18日, 14:27
Been thanked: 1 time

#3 Re: [原创]stata合并数据集详细举例(merge)

未读文章 hellohappy » 2019年8月19日, 13:43

hufei_lt 写了:
2019年8月19日, 07:06
您好 我尝试了最后一个例子,发现数据集合2的时间“2013”并没有加入到合并后的结果中。 请问您可以实现吗

没有把,我刚刚也试了一下,是可以合并进去的。
合并命令执行完毕后,截图是这样的:
stata的merge命令使用截图1.png
stata的merge命令使用截图1.png (7.98 KiB) 查看 187 次
stata的merge命令使用截图1.png
stata的merge命令使用截图1.png (7.98 KiB) 查看 187 次

合并以后有一个变量叫 _merge ,这个变量里面,赋值为1、 2、 3,分别代表观测值是 from masterfrom usingmatched
上面截图中
    from master 的数字 12 就是原来的数据集1里面有,而匹配数据集2没有的观测值个数,
    from using 的数字 4 就是原来的数据集1里面没有,而匹配数据集2有的观测值个数,
    matched 的数值 0 就是原来的数据集1里面有,而匹配数据集2也有的观测值个数。

可能你数据集写错了,我把这个样例数据集合传上来,你再回去试一下吧。

最后一个例子的数据集1和2:
例5的数据集1和2.zip
(1.52 KiB) 尚未被下载

Link:
Hide post links
Show post links

hufei_lt
帖子: 3
注册时间: 2019年8月19日, 07:03

#4 Re: [原创]stata合并数据集详细举例(merge)

未读文章 hufei_lt » 2019年8月19日, 16:00

你好 您的方法没有问题  最后一个例子可以实现 
是我在将csv转成dta文件时出了错误
insheet using C:\Users\Administrator\Desktop\TRD_Week.csv
describe
save "C:\Users\Administrator\Desktop\TRD_Week.dta"
insheet using C:\Users\Administrator\Desktop\TRD_Week2.csv
describe
save "C:\Users\Administrator\Desktop\TRD_Week2.dta"

TRD_Week.csv  和 TRD_Week2.csv   是不同的 但是得到的TRD_Week.dta 却和TRD_Week2.dta 一模一样

Link:
Hide post links
Show post links


回复