我正在寻找一种方法来检查Stata数据集中是否存在变量,如果不是在循环中重复检查变量名称,直到找到存在的变量名称。我知道对涉及confirm
的类似问题的其他回复,并依赖于测试_rc
的值。
但是,如果您尝试重复使用这些方法,则在循环的任何给定迭代中_rc
的值仅提供在任何先前迭代中是否存在至少一个错误的信息。我希望继续测试,直到没有错误,但每当第一次尝试导致错误时,无法判断第二次尝试是否也会导致错误,因为_rc
保持不变(假设所有错误)报告相同的代码)。有没有办法手动将_rc
重置为零,或以不那么临时的方式测试变量是否存在而不涉及_rc
?
答案 0 :(得分:4)
我认为对capture
和_rc
程序的工作存在一些误解。
1。我引用:
...如果您尝试在任何情况下重复使用这些方法的_rc的值 给定迭代循环只能提供有关的信息 在任何先前的迭代中至少有一个错误。
这不正确。 _rc
的值取决于紧接在之前的命令的结果,因此它将被更新,直到循环结束。
2。我再次引用:
......每当第一次尝试导致错误时,都无法判断 如果第二次尝试也导致错误......
也不正确。您可以通过查看_rc
来判断第二次,第三次等尝试是否是错误。这是( 1 )的结果。
一个例子可能表明这一点:
clear all
set more off
sysuse auto
gen var1 = 1
gen var2 = 2
local vlist var0 var1 var2 var3 mpg var4
foreach v of local vlist {
capture confirm variable `v'
display "is `v' present ? " (_rc == 0)
}
导致
is var0 present ? 0
is var1 present ? 1
is var2 present ? 1
is var3 present ? 0
is mpg present ? 1
is var4 present ? 0
显示不存在的变量var0
遵循var1
,它确实存在,依此类推。
答案 1 :(得分:1)
Stata文档在confirm
的帮助页面下提供了this example。与capture
一起使用,我相信您可以避免重置_rc
时遇到的问题。出于您的目的,只需使用capture confirm existence `v'
foreach v of local varlist {
capture confirm string variable `v'
if !_rc {
action for string variables
}
else {
action for numeric variables
}
}
}
答案 2 :(得分:1)
以下是如何在潜在变量名列表中查找数据中存在的第一个变量名称的示例
sysuse auto
local vlist "var1 var2 mpg var3"
foreach var of local vlist {
capture confirm variable `var'
if !_rc {
local first_present "`var'"
continue, break // <-- stops the loop after the first present variable
}
}
if "`first_present'" != "" {
di as txt "The first present variable name is: " ///
as result "`first_present'"
}
else {
di as txt "the list contained no present variable names"
}