stata数据合并

Stata merge 后 _merge 全是 1 或 2(一条都没匹配上)

匹配键类型不一致是头号原因:一边是字符串一边是数值,或者键里有空格、前导零。describe 一眼看穿。

报错原文

tab _merge  →  _merge==1: 500, _merge==2: 480, _merge==3: 0

为什么会报这个错

merge 没报错,但 _merge==3 为 0,说明一条都没匹配上。原因几乎都出在匹配键上:

  1. 类型不一致。主表 id 是 str6,using 表是 long,Stata 不会自动转换,直接判不匹配。
  2. 空格或不可见字符。"001" 和 "001 " 不相等。
  3. 前导零。"001" 和 1 转成字符串后变成 "1",对不上。
  4. 编码不一致。中文键在不同来源里一个是 UTF-8 一个是 GBK。
  5. 键名不同。一边叫 firmid,一边叫 firm_id。

怎么解决

第一步:对比两边键的类型

describe id

主表和 using 表各看一次,str 和 long/int 必须统一。

第二步:统一类型

* 数值转字符串(保留前导零用 %06.0f)
tostring id, replace format(%06.0f)
 
* 字符串转数值
destring id, replace

第三步:清理空格

replace id = strtrim(id)
replace id = strupper(id)

第四步:重新 merge 并检查

merge 1:1 id using "using.dta"
tab _merge

_merge==3 的比例应该接近你预期。

代码示例

* 主表
describe id

* using 表
use "using.dta", clear
describe id

* 统一为字符串并去空格
use "master.dta", clear
tostring id, replace format(%06.0f)
replace id = strtrim(id)

merge 1:1 id using "using.dta"
tab _merge

同工具的其他报错

报错解决了,但方法还没搞懂?

报错只是表象。因果推断、面板数据、稳健性检验这些方法背后的逻辑,知识库里按「原理 × 直觉 × 代码」讲清楚了。

进入知识库 →