r(459) 是 Stata 在执行 merge 合并数据时比较常见的一类错误,通常与合并键变量的数据类型、取值形式或主从数据集中的变量定义不一致有关。遇到这个错误时,不建议直接修改 merge 命令,而应该先检查参与匹配的变量。
一、先了解 Stata 的 merge 合并逻辑
Stata 中常见的合并方式包括一对一、一对多和多对一,例如:
statamerge 1:1 id using "data2.dta"
或者:
statamerge 1:m id using "data2.dta"
其中 id 就是用于匹配两个数据集的关键变量,也叫合并键(key variable)。
正常情况下,两个数据集中的 id 必须能够按照同一种数据形式进行匹配。如果一个数据集中的 id 是数值型,而另一个数据集中的 id 是字符串型,Stata 就无法直接完成匹配。
例如主数据中:
statadescribe id
得到:
storage display value variable name type format label ----------------------------------------- id long %12.0g
而 using 数据中的 id 却是:
id str10 %10s
此时直接执行:
statamerge 1:1 id using "data2.dta"
就可能产生合并错误。
二、最常见原因:合并变量类型不一致
这是排查 r(459) 时首先应该检查的问题。
可以分别查看两个数据集中的关键变量:
statadescribe id
如果当前数据中的 id 是数值型,而 using 数据中的 id 是字符串型,就需要统一变量类型。
方法一:将字符串转换为数值
如果字符串变量实际保存的是纯数字,例如:
"10001" "10002" "10003"
可以使用:
statadestring id, replace
转换完成后检查:
statadescribe id
如果存在非数字字符,可以先查看具体内容:
statalist id if missing(real(id))
然后根据实际情况清理数据。
例如:
statareplace id = strtrim(id) destring id, replace
方法二:将数值转换为字符串
如果希望保留字符串格式,则可以使用:
statatostring id, replace
也可以指定格式,例如:
statatostring id, replace format(%08.0f)
这一点对于带前导零的编号尤其重要。
例如:
000123 000124 000125
如果直接将其转换成数值:
123 124 125
前面的 0 就会消失。如果原始数据中的编号具有固定长度,那么这种转换可能导致后续匹配失败。
三、注意“看起来一样”不代表真的一样
有些情况下,两个变量虽然都是字符串型,但依然无法正确合并。
例如一个数据集中的编号是:
"ABC001"
另一个数据集中的编号可能实际上是:
"ABC001 "
后者末尾多了一个空格。
可以使用:
statareplace id = strtrim(id)
去除字符串两端的空格。
如果数据中存在隐藏字符、大小写差异,也需要进一步处理。例如:
statareplace id = upper(id)
将字母统一转换成大写。
对于编码规则明确的数据,可以组合处理:
statareplace id = upper(strtrim(id))
然后再执行 merge。
四、检查两个数据集的合并变量是否真的存在
执行合并之前,可以先分别确认变量:
statadescribe id
如果变量名称不同,例如主数据使用:
company_id
而另一个数据使用:
firm_id
那么不能直接写:
statamerge 1:1 company_id using "data2.dta"
因为 using 数据中没有同名变量。
可以在必要时先统一变量名称:
statause "data2.dta", clear rename firm_id company_id save "data2_clean.dta", replace
然后再执行:
statause "data1.dta", clear merge 1:1 company_id using "data2_clean.dta"
五、检查合并变量是否存在重复值
除了变量类型之外,merge 1:1 对数据结构还有严格要求。
例如:
statamerge 1:1 id using "data2.dta"
意味着 id 在两个数据集中都应该唯一。
可以使用:
stataisid id
检查当前数据是否满足唯一性。
如果出现错误,则说明 id 存在重复值。
也可以使用:
stataduplicates report id
查看重复情况。
进一步定位重复记录:
stataduplicates list id
假设发现一个企业有多个年份的数据:
id year 1001 2022 1001 2023 1002 2022 1002 2023
此时单独使用 id 显然不能作为一对一合并键。
如果真正的唯一组合是“企业 + 年份”,应该使用:
statamerge 1:1 id year using "data2.dta"
因此,解决 merge 错误之前,一定要先明确数据的实际关系,而不是为了让命令运行而随意更换 1:1、1:m 或 m:1。
六、正确区分 1:1、1:m 和 m:1
假设主数据是企业基本信息:
id 1001 1002 1003
而 using 数据是企业年度数据:
id year 1001 2022 1001 2023 1002 2022 1002 2023
此时一个企业对应多个年度记录,因此可以考虑:
statamerge 1:m id using "data2.dta"
反过来,如果当前数据中同一个 id 有多条记录,而 using 数据中的 id 唯一,则应该考虑:
statamerge m:1 id using "data2.dta"
需要特别注意,m:m 虽然可以让某些合并命令执行,但通常不应该把它当作解决数据结构问题的办法。
m:m 容易产生大量非预期匹配记录,严重时会导致数据行数膨胀,因此应优先通过业务含义确定真正的合并关系。
七、使用 merge 前先做系统检查
一个比较稳妥的排查流程如下。
先打开主数据:
statause "data1.dta", clear
检查合并变量:
statadescribe id codebook id
检查唯一性:
stataisid id
如果要求 1:1 合并,还需要检查 using 数据:
statapreserve use "data2.dta", clear describe id isid id restore
如果两个数据集的变量类型一致,并且唯一性也符合预期,再执行:
statamerge 1:1 id using "data2.dta"
这种方式比反复修改 merge 命令更加可靠。
八、如果是数值型变量,还要注意变量标签和编码
Stata 中数值型变量可能附带 value label。
例如:
statadescribe gender
可能显示:
gender byte %8.0g gender_label
这里的 gender 本身仍然是数值型变量,只是显示时通过标签呈现为文字。
因此,不能仅凭浏览器里看到的内容判断变量类型。应该使用:
statadescribe gender
确认实际 storage type。
如果两个数据集的编码规则不同,即使变量都是数值型,也可能出现逻辑上的匹配问题。
例如一个数据集:
1 = 男 2 = 女
另一个数据集:
0 = 男 1 = 女
这属于编码含义不一致,并不是简单的数据类型问题,需要根据数据字典重新编码。
九、检查合并后的 _merge 变量
成功执行 merge 后,Stata 通常会生成 _merge 变量。
可以执行:
statatabulate _merge
通常可以看到类似:
_merge | Freq. -------+--------- 1 | 1000 2 | 200 3 | 800
其中:
-
_merge == 1:只存在于主数据; -
_merge == 2:只存在于using数据; -
_merge == 3:两个数据集成功匹配。
如果只希望保留成功匹配的记录,可以使用:
statakeep if _merge == 3 drop _merge
不过,不建议在没有检查结果之前直接删除 _merge。它是判断数据合并质量的重要依据。
十、一个完整的排错示例
假设有两个文件:
company.dta financial.dta
两者都通过 firm_id 关联。
先检查主数据:
statause "company.dta", clear describe firm_id isid firm_id
再检查另一个数据:
statause "financial.dta", clear describe firm_id isid firm_id
如果发现:
company.dta firm_id = long financial.dta firm_id = str10
说明变量类型不同。
假设 financial.dta 中保存的是纯数字字符串,可以进行:
statadestring firm_id, replace
然后重新检查:
statadescribe firm_id
确认两个文件中的类型一致后,再回到主数据:
statause "company.dta", clear merge 1:1 firm_id using "financial.dta"
如果此时又提示唯一性问题,则需要重新判断数据关系。例如财务数据可能是一家公司对应多个年份,那么真正的键可能应该是:
statafirm_id year
这时可以改为:
statamerge 1:1 firm_id year using "financial.dta"
前提是 firm_id year 在两个数据集中都唯一。
十一、不要简单使用 capture 隐藏 r(459)
有些人遇到错误后会写:
statacapture merge 1:1 id using "data2.dta"
这样做只是让 Stata 不显示错误,并没有解决问题。
更合理的方法是查看返回代码:
statacapture merge 1:1 id using "data2.dta" display _rc
如果返回:
459
说明命令依然执行失败。
capture 更适合编写需要容错的批处理程序,而不应该用于掩盖数据结构错误。
十二、推荐的 Stata 合并排查清单
遇到 r(459) 或类似 merge 错误时,可以按照以下顺序检查:
-
确认
merge使用的变量名称正确; -
确认两个数据集中的合并变量类型一致;
-
检查字符串变量是否存在前后空格;
-
检查大小写、特殊字符和前导零;
-
使用
isid检查关键变量是否唯一; -
如果不唯一,判断是否应该加入
year等其他键变量; -
根据真实业务关系选择
1:1、1:m或m:1; -
避免为了绕过错误而直接使用
m:m; -
合并成功后使用
tab _merge检查匹配情况; -
确认结果符合预期后,再删除
_merge。
总结
Stata 合并数据出现 r(459) 时,真正需要解决的通常不是命令本身,而是两个数据集之间的合并键定义不一致。尤其应该优先检查变量类型、字符串格式、重复值以及 merge 的匹配关系。
实际操作中,可以形成一个固定习惯:先 describe 检查类型,再用 isid 检查唯一性,最后根据数据结构确定 merge 类型。如果两个数据集属于面板数据,还应重点考虑 id + year 这样的联合主键。
只要合并键定义正确、变量格式统一,并且 1:1、1:m、m:1 与实际数据关系相符,大多数 Stata 合并错误都可以快速定位并解决。