Stata中如何从多个国家名称变量生成对应国家0-1标识变量
原代码错误原因
你的代码从逻辑到语法都存在问题,根本无法实现需求:
- 核心逻辑偏差:Stata宏列表操作符
&是求多个集合的交集,只会返回同时存在于s1到s20所有变量里的内容,和你需要的「只要国家出现在任意一个country变量中就标记为1」的需求完全相反 - 语法错误:直接写
local s1 = Countryies1 [i']的取值方式不符合Stata语法,且你代码里变量名混用了country1和Countryies1`,拼写不一致会直接触发变量不存在报错 - 效率极低:逐行遍历观测、逐个定义20个局部宏的写法冗余度极高,数据量稍大时运行速度极慢。
正确实现方案
不需要写冗余的逐行取值逻辑,两步就能完成所有国家标识变量的生成,以下是可直接运行的代码:
* 1. 先提取country1-country20里所有出现过的不重复国家名称 preserve stack country1-country20, into(country_name) clear drop if missing(country_name) // 剔除拆分产生的空值 levelsof country_name, local(country_list) clean restore * 2. 循环为每个国家生成0-1标识变量 foreach c of local country_list { * 把国家名中的空格替换为下划线,避免生成非法变量名 local varname = subinstr("`c'", " ", "_", .) gen byte `varname' = 0 * 只要国家出现在任意一个country1-country20变量中,就赋值为1 forvalues j = 1/20 { replace `varname' = 1 if country`j' == "`c'" } }
如果国家名称中包含斜杠、逗号等其他特殊字符,在生成varname的步骤里多加几行subinstr()替换即可,保证变量名符合Stata命名规则。
运行完成后,数据集中会新增所有出现过的国家对应的变量:观测包含对应国家则值为1,不包含则值为0,完全匹配你的需求。
内容的提问来源于stack exchange,提问作者Shri
相关产品推荐
相关产品推荐

