Stata中使用foreach循环调用local变量报错‘local not found’求助
问题分析与解决
错误根源
你的代码抛出local not found的直接原因是foreach循环的语法错误:
- 遍历本地宏
postal_cleveland的元素时,正确写法是用**反引号()**包裹宏名来引用其内容,而非写in local postal_cleveland——Stata会把local`当成一个待遍历的元素名称,自然找不到对应对象,触发报错。
另外还有一个逻辑隐患需要注意:
- 你用
strpos(postal_code,x')判断匹配,但strpos是检查字符串是否包含子串,比如postal_code为280860时,也会被strpos(..., "28086")判定为匹配。如果你的邮政编码是固定长度的完整编码,用精确匹配postal_code == "x'"才符合需求。
修正后的代码
情况1:精确匹配完整邮政编码(推荐)
local postal_cleveland "28086 28150 28152 28021 28090 28114 28073 28020 28017 28151 28169 28089 28038 28042 28136" // 正确引用宏内容,遍历每个编码 foreach x in `postal_cleveland' { // 精确匹配,保留符合条件的观测 keep if postal_code == "`x'" }
情况2:包含匹配(仅需匹配子串时使用)
local postal_cleveland "28086 28150 28152 28021 28090 28114 28073 28020 28017 28151 28169 28089 28038 28042 28136" foreach x in `postal_cleveland' { // 保留包含该子串的观测 keep if strpos(postal_code, "`x'") }
优化方案
多次执行keep if效率偏低,你可以用inlist()函数一次性完成匹配,代码更简洁高效:
local postal_cleveland "28086 28150 28152 28021 28090 28114 28073 28020 28017 28151 28169 28089 28038 28042 28136" // 直接将宏内容作为inlist的参数,一次性筛选 keep if inlist(postal_code, `postal_cleveland')
内容的提问来源于stack exchange,提问作者econ_grad12345
相关产品推荐
相关产品推荐

