You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Stata技术问询:从保险字符串变量生成哑变量及相关问题

解决Stata中保险类型哑变量的两个问题

针对你提出的两个问题,我来一步步帮你解决:

一、自动生成所有保险品牌的唯一列表

手动整理保险品牌效率太低,用Stata的内置命令就能自动提取所有不重复的保险品牌,步骤如下:

  1. 拆分Insurance变量里用|||分隔的多个保险品牌;
  2. 将宽格式数据转成长格式,方便统一清理冗余内容;
  3. 提取所有唯一的保险品牌并存储到宏变量中。

具体代码如下:

* 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:10:40