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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:45:40