Loops 检查Stata中是否存在变量

Loops 检查Stata中是否存在变量,loops,stata,Loops,Stata,我正在寻找一种方法来检查Stata数据集中是否存在变量,如果不存在,则通过循环重复检查变量名,直到找到一个存在的变量。我知道对类似问题的其他回答涉及确认,并取决于测试\u rc的值 但是,如果您尝试重复使用这些方法,则在循环的任何给定迭代中,\u rc的值仅用于说明在任何先前的迭代中是否存在至少一个错误。我希望继续测试直到没有错误,但无论何时第一次尝试导致错误,都无法判断第二次尝试是否也会导致错误,因为无论怎样,\u rc都保持不变(假设所有错误报告相同的代码)。有没有办法手动将\u rc重置为

我正在寻找一种方法来检查Stata数据集中是否存在变量,如果不存在,则通过循环重复检查变量名,直到找到一个存在的变量。我知道对类似问题的其他回答涉及
确认
,并取决于测试
\u rc
的值


但是,如果您尝试重复使用这些方法,则在循环的任何给定迭代中,
\u rc
的值仅用于说明在任何先前的迭代中是否存在至少一个错误。我希望继续测试直到没有错误,但无论何时第一次尝试导致错误,都无法判断第二次尝试是否也会导致错误,因为无论怎样,
\u rc
都保持不变(假设所有错误报告相同的代码)。有没有办法手动将
\u rc
重置为零,或者以不涉及
\u rc
的不太特别的方式测试变量的存在?

Stata文档在
确认
的帮助页下给出。与
捕获
结合使用,我相信您可以避免重置
\u rc
的问题。出于您的目的,只需将循环中的第一行替换为
capture confirm'v'

foreach v of local varlist {
                capture confirm string variable `v'
                if !_rc {
                        action for string variables
                }
                else {
                        action for numeric variables
                }
        }
}

Stata文档在帮助页面下提供了确认。与
捕获
结合使用,我相信您可以避免重置
\u rc
的问题。出于您的目的,只需将循环中的第一行替换为
capture confirm'v'

foreach v of local varlist {
                capture confirm string variable `v'
                if !_rc {
                        action for string variables
                }
                else {
                        action for numeric variables
                }
        }
}

我认为对
捕获
\u rc
程序的工作存在一些误解

1.我引用:

。。。如果您尝试重复使用这些方法,则在任何 给定的循环迭代只提供是否存在循环的信息 在之前的任何迭代中至少出现一个错误

这是不对的。
\u rc
的值取决于紧接前面的命令的结果,因此它将被更新,直到循环完成

2.我再次引用:

。。。无论何时第一次尝试导致错误,都无法判断 如果第二次尝试也导致错误

也不正确。通过查看
\u 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
,以此类推。

我认为对
捕获
\u rc
过程的工作存在一些误解

1.我引用:

。。。如果您尝试重复使用这些方法,则在任何 给定的循环迭代只提供是否存在循环的信息 在之前的任何迭代中至少出现一个错误

这是不对的。
\u rc
的值取决于紧接前面的命令的结果,因此它将被更新,直到循环完成

2.我再次引用:

。。。无论何时第一次尝试导致错误,都无法判断 如果第二次尝试也导致错误

也不正确。通过查看
\u 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
,以此类推。

下面是一个示例,介绍如何在潜在变量名列表中查找数据中的第一个变量名

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"
}
sysuse自动
本地vlist“var1 var2 mpg var3”
局部vlist的foreach-var{
捕获确认变量'var'
如果{
本地第一个字母“var”

继续,break/下面是一个示例,介绍如何在潜在变量名列表中查找数据中的第一个变量名

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"
}
sysuse自动
本地vlist“var1 var2 mpg var3”
局部vlist的foreach-var{
捕获确认变量'var'
如果{
本地第一个字母“var”

继续,打破//仅对变量名列表使用名称
varlist
是常规的(尽管不是强制性的)。请注意,要使此示例适应所述问题,需要藐视约定,使名称不一定是变量名。您还需要在第一次成功时退出循环。这是常规的(虽然不是强制性的)仅对变量名列表使用名称
varlist
。请注意,使此示例适应所述问题需要藐视约定,使名称不一定是变量名。您还需要在第一次成功时退出循环。您看过SSC中的
isvar
吗?它采用可能命名的名称列表您的数据集中的变量,并将其过滤到那些确实是变量名的名称列表和其他名称列表中。谢谢!
isvar
非常有效,这正是我要寻找的。您看过SSC中的
isvar
吗?它会将可能命名数据集中变量的名称列表过滤到这些名称列表中确实是变量名的名称和其他名称的列表。谢谢!
isvar
非常有效,这正是我想要的。