跨字符串变量匹配观测值:国家GDP与民主评分数据匹配需求
匹配国家层面GDP与民主评分数据的Stata解决方案
我有两个国家层面的连续指标:
- 人均GDP(GDP per capita):对应变量
gdp_adj,其国家编码变量为country,共184条观测值 - 民主评分(democracy score):对应变量
democracy_score,其国家编码变量为code(与country编码规则一致,如AFG代表阿富汗),共249条观测值
需要将两个数据集按国家编码匹配,仅保留两个指标数据均完整的观测值,最终得到结构为country gdp_adj democracy_score的数据集。
示例数据
* Example generated by -dataex-. For more info, type help dataex clear input str3 country float gdp_adj str3 code str5 democracy_score "AFG" 2079.9219 "ABW" "0.813" "AGO" 6602.424 "ADO" "#N/A" "ALB" 13655.665 "AFG" "0.174" "ARE" 71782.16 "AIA" "#N/A" "ARG" 22071.75 "ALB" "0.576" "ARM" 14317.553 "ANT" "#N/A" "ATG" 23035.66 "ARE" "0.232" "AUS" 49379.09 "ARG" "0.632" "AUT" 55806.44 "ARM" "0.496" "AZE" 14442.04 "ASM" "#N/A" "BDI" 729.6584 "ATG" "#N/A" "BEL" 51977.18 "AUS" "0.861" "BEN" 3156.439 "AUT" "0.852" "BFA" 2110.0623 "AZE" "0.200" "BGD" 5467.208 "BDI" "0.170" "BGR" 23270.225 "BEL" "0.820" "BHR" 49768.98 "BEN" "0.473" "BHS" 35161.832 "BFA" "0.358" "BIH" 14634.738 "BGD" "0.388" "BLR" 19279.209 "BGR" "0.602" "BLZ" 9028.552 "BHR" "0.190" "BOL" 8528.749 "BHS" "0.688" "BRA" 14685.128 "BIH" "0.399" end
解决步骤(Stata代码)
1. 拆分数据集(若原始为两个独立文件可跳过此步)
当前示例数据将两个数据集混在一起,先拆分出GDP数据和民主评分数据:
* 提取GDP数据:保留country和gdp_adj变量 preserve keep country gdp_adj drop if missing(country, gdp_adj) // 剔除GDP数据中的缺失观测 save "gdp_data.dta", replace restore * 提取民主评分数据:保留code和democracy_score变量 preserve keep code democracy_score drop if missing(code) // 先剔除编码缺失的观测 replace democracy_score = "" if democracy_score == "#N/A" // 将#N/A替换为Stata缺失值 destring democracy_score, replace // 将字符型评分转为数值型 drop if missing(democracy_score) // 剔除民主评分缺失的观测 rename code country // 统一编码变量名,方便合并 save "democracy_data.dta", replace restore
2. 合并数据集并保留匹配完整的观测
* 加载GDP数据 use "gdp_data.dta", clear * 按国家编码合并民主评分数据,仅保留双方都匹配成功的观测 merge 1:1 country using "democracy_data.dta", keep(match) nogen * 最终数据集结构:country gdp_adj democracy_score list, clean
结果说明
执行上述代码后,得到的数据集仅包含同时有有效GDP数据和有效民主评分的国家,变量结构完全符合需求。
内容的提问来源于stack exchange,提问作者nesta1990
相关产品推荐
相关产品推荐

