Stata循环调用egen anycount报错invalid name r(198)问题排查
解决Stata循环中
anycount()触发的"invalid name r(198)"错误 问题根源
你遇到的invalid name r(198)错误,本质是循环中生成的变量名违反了Stata的变量命名规则:
Stata要求变量名必须以字母(a-z/A-Z)或下划线开头,后续字符只能是字母、数字或下划线;如果你的药品编码包含负号(-)、科学计数法符号(e+/e-)等特殊字符,直接用d_drug'`命名变量就会触发错误。
另外,如果你的药品编码是极大的数值,Stata会自动用科学计数法展示(比如1e+06),此时levelsof返回的水平值包含e+,生成的d_1e+06变量名因含+号而非法。
解决方案
根据你的需求,这里提供两种适配不同场景的解决方法:
方法1:动态处理非法字符,生成合法变量名
针对编码含特殊字符的情况,先对编码字符串做替换,把非法字符转换成合法的变量名字符:
clear input DrugList Drug1 Drug2 Drug3 Drug4 Drug5 1234 7934 1234 . . . 5678 1234 5678 . . . 9876 9876 3456 . . . 3456 9876 . . . . 7934 9876 5678 7934 1234 . 17453 5678 . . . . end levelsof DrugList, local(drugs) foreach drug in `drugs' { // 替换负号、科学计数法符号为合法字符 local clean_drug = subinstr("`drug'", "-", "neg", .) local clean_drug = subinstr("`clean_drug'", "e+", "eplus", .) local clean_drug = subinstr("`clean_drug'", "e-", "eminus", .) // 生成合法变量名并统计次数 egen d_`clean_drug' = anycount(Drug1-Drug27), values(`drug') }
方法2:统一转换为字符串格式,避免科学计数法
如果你的编码是大数值导致科学计数法问题,先把DrugList转换为字符串(用固定格式保留完整数字),再执行循环:
clear input DrugList Drug1 Drug2 Drug3 Drug4 Drug5 1234 7934 1234 . . . 5678 1234 5678 . . . 9876 9876 3456 . . . 3456 9876 . . . . 7934 9876 5678 7934 1234 . 17453 5678 . . . . end // 转换为字符串,用%20.0f确保大数值不转为科学计数法 tostring DrugList, replace format(%20.0f) levelsof DrugList, local(drugs) foreach drug in `drugs' { // 把字符串编码转回数值,适配anycount的values选项 egen d_`drug' = anycount(Drug1-Drug27), values(`=real(`drug')') }
验证你的示例数据
针对你提供的示例数据,直接运行修正后的代码(注意把Drug1-Drug27改为Drug1-Drug5适配示例列数),会生成你预期的d_1234、d_3456等变量,结果与你给出的预期输出完全一致。
内容的提问来源于stack exchange,提问作者Danielle Newby
相关产品推荐
相关产品推荐

