我正在尝试用本地字符串完成一个
foreach
循环。但是,我收到 local not found
错误。我只想keep
包含以下邮政编码的观察结果。
我正在遵循 Stata 帮助文件中的本地示例,我的可变邮政编码是字符串格式。我哪里错了?
这是代码:
local postal_cleveland "28086 28150 28152 28021 28090 28114 28073 28020 28017 28151 28169 28089 28038 28042 28136"
foreach x in local postal_cleveland {
keep if strpos(postal_code, `x')
}
local not found
r(111);
我不知道你指的是哪个帮助文件,但是这里有几个错误,你已经被第一个错误抛弃了。循环应该开始
foreach x of local postal_cleveland {
关键字
of
和 in
不可互换。
你用
in
输入的内容是合法的,因为任何列表都可以跟在in
后面,但是当你进入循环内部时,Stata只能将local
解释为字符串变量或标量的名称,但你没有这样的:因此错误消息。
另一个错误尚未困扰您,但现在应该修复。当您在字符串变量中查找文字字符串时,必须使用
" "
来分隔字符串;否则,正如刚才所见,Stata 只能猜测您给它的名称是字符串变量或标量。所以,你需要
keep if strpos(postal_code, "`x'")
还有一个错误尚未困扰您,但现在应该修复。一走就到了
keep if strpos(postal_code, "28086")
Stata 将遵循您的指示 因此所有其他邮政编码的观察结果将消失。然后 Stata 将继续前进并进行下一次观察
keep if strpos(postal_code, "28150")
它会再次遵循您的指示。但没有这样的观察结果:你通过前一次迭代的暗示来
drop
追踪它们。所以,现在你没有任何数据,无法做任何有用的事情。
你可以完全避免循环然后继续
keep if strpos(postal_code, "28086") | strpos(postal_code, "28150") | ...
其中
...
表示具有不同代码的其他调用。这只是我的简写,因为我不会在这里把它们写出来;这不是 Stata 语法!
或者您可以使用循环并构建一个(且只有一个)
keep
语句。
这可能是
gen tokeep = 0
foreach x of local postal_cleveland {
replace tokeep = 1 if strpos(postal_code, "`x'")
}
keep if tokeep
我推荐这是更好的风格。
否则,
keep
会立即起作用:它keep
是满足指定标准的观察结果,因此drop
是所有其他观察结果。
详细:这里的string表示字符串存储或者变量类型;字符串作为(显示)格式巧合仅意味着相同的变量。