当我在Stata中使用foreach
循环时,我被一个奇怪的错误消息弄糊涂了。
我从一个数据集中收集了几个地理名称的名称列表,并将它们放在三个本地区中:county
,city
,muni
。然后,我"匹配"它们在另一个数据集中具有某些名称(parkname
)。
前两个工作正常,但对于最后一个本地宏muni
,foreach
失败并抛出一个奇怪的错误消息。但是,正如您所看到的,我不会在循环体中添加"太多" 括号:只有两个。
那么问题的根源是什么?我高度怀疑它源于我构建最后一个本地的方式,但我无法弄清楚问题。
顺便说一句,city1
到city4
指的是中文字符(Unicode)中的四个城市名称,但由于Stack Overflow不允许使用Unicode字符,我会替换它们。我不确定这个事实是否与错误信息有关。
import excel province=A city=B county=C using geonamelist.xlsx, clear
*-------------------------
* city and county list
*-------------------------
qui levelsof county , local(county)
qui levelsof city , local(city)
** the municipalities are classified as provincial unit
local muni "city1" "city2" "city3" "city4"
*--------------------------
* Industry Park data
*--------------------------
// Import industry park namelist
import excel order=A province=C class=D parkname=E area_NDRC=F ///
area_MLR=J batch=I using namelist1.xls, clear
drop in 1/1
tempfile provincial
save "`provincial'"
import excel order=A province=C class=D parkname=E area_NDRC=F ///
area_MLR=J batch=I using namelist2.xls,clear
drop in 1/1
append using "`provincial'"
** Matching the county names
gen county = ""
foreach i of local county {
qui replace county = "`i'" if strpos(parkname,"`i'")>0
}
gen city = ""
foreach i of local city {
qui replace city = "`i'" if strpos(parkname,"`i'")>0
}
foreach i of local muni {
qui replace city = "`i'" if strpos(parkname,"`i'")>0
}
sort order
答案 0 :(得分:2)
我们这里没有任何内容可以重现,因为您的示例取决于我们没有的文件。不幸的是,我和(我怀疑)许多最活跃的Stata用户不会以任何方式阅读或说中文。
正如您所说,语法没有明显区别。
但是,我建议不要这样做:
. local muni "city1" "city2" "city3" "city4"
. mac li
<other stuff listed here>
_muni: city1" "city2" "city3" "city4
Stata将外引号标记为分隔符。你在实践中有真名,但无论哪种方式,你需要复合双引号形式
local muni `" "city1" "city2" "city3" "city4" "'
所以我唯一的猜测是,你得到的信息是该宏定义的副作用。