foreach 和本地命令 ata

问题描述 投票:0回答:1

我正在尝试用本地字符串完成一个

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 stata local
1个回答
0
投票

我不知道你指的是哪个帮助文件,但是这里有几个错误,你已经被第一个错误抛弃了。循环应该开始

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") | ... 

其中

...
表示具有不同代码的其他调用。

或者您可以使用循环并构建一个(且只有一个)

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表示字符串存储或者变量类型;字符串作为(显示)格式巧合仅意味着相同的变量。

© www.soinside.com 2019 - 2024. All rights reserved.