Stata技术问询:从保险字符串变量生成哑变量及相关问题
解决Stata中保险类型哑变量的两个问题
针对你提出的两个问题,我来一步步帮你解决:
一、自动生成所有保险品牌的唯一列表
手动整理保险品牌效率太低,用Stata的内置命令就能自动提取所有不重复的保险品牌,步骤如下:
- 拆分
Insurance变量里用|||分隔的多个保险品牌; - 将宽格式数据转成长格式,方便统一清理冗余内容;
- 提取所有唯一的保险品牌并存储到宏变量中。
具体代码如下:
* 1. 以|||为分隔符拆分Insurance变量 split Insurance, parse(|||) * 2. 转为长格式,便于统一处理拆分后的内容 reshape long Insurance, i(ID_MHP) j(seq) * 3. 清理字符串:去掉多余的|符号和空值 replace Insurance = trim(subinstr(Insurance, "|", "", .)) drop if Insurance == "" * 4. 提取所有唯一保险品牌,存入local宏 levelsof Insurance, local(insurance_brands) clean * (可选)查看生成的品牌列表 di "所有保险品牌:`insurance_brands'" * (可选)转回原宽格式数据 drop seq duplicates drop ID_MHP, force
执行后,insurance_brands宏里就保存了所有不重复的保险品牌,完全不需要手动整理。
二、用regexm的否定形式赋值0
Stata里没有regexm!这种写法,但可以用**逻辑非符号!**实现“不匹配”的判断,也就是!regexm(...)。不过还有更简洁的写法:
推荐简洁写法
因为regexm()匹配成功返回1,失败返回0,所以可以直接生成哑变量,无需多次replace:
* 直接生成Aetna哑变量:匹配到为1,未匹配为0 gen Aetna = regexm(Insurance, "Aetna") * 如果需要处理Insurance为"NA"的缺失情况 gen Aetna = cond(Insurance == "NA", ., regexm(Insurance, "Aetna"))
用否定形式的写法
如果一定要用否定逻辑赋值0,可以这样写:
gen Aetna = . replace Aetna = 1 if regexm(Insurance, "Aetna") * 用!regexm表示未匹配,同时排除NA的情况 replace Aetna = 0 if !regexm(Insurance, "Aetna") & Insurance != "NA"
进阶:批量生成所有哑变量
结合第一步得到的insurance_brands宏,还能批量生成所有保险品牌的哑变量,不用逐个手动编写:
foreach brand in `insurance_brands' { gen `brand' = regexm(Insurance, "`brand'") replace `brand' = . if Insurance == "NA" }
这样就能一次性生成所有需要的哑变量,完全自动化。
内容的提问来源于stack exchange,提问作者Fuca26
相关产品推荐
相关产品推荐

