9

我正在编写一个.do来检查多个.dta文件中是否存在某些变量以及检查这些变量的某些值是否存在。但是,我的代码在遇到无效的变量名时停止执行。

我知道我混合了 Java 和 Stata 编码,这是完全不合适的,但有什么办法可以做类似的事情:

try {
su var1
local var1_mean=(mean)var1
local var1_min=(min)var1
local var1_max=(max)var1
...
}
catch (NoSuchVariableException e) {
System.out.println("Var1 does not exist")
}
// So that the code does not stop executing...?
4

3 回答 3

24

简短的回答是肯定的。一个稍微长一点的答案是,通过类比 Java 来猜测语法可能是什么成功的机会很小。最好阅读 Stata 的文档,例如先浏览 [P] 手册中的主要条目。

这里被困的问题是不var1存在。这段代码是合法的,或者我相信:

capture su var1, meanonly 

if _rc == 0 { 
     local var1_mean = r(mean)
     local var1_min  = r(min)
     local var1_max  = r(max)
}
else display "var1 does not exist"

这个想法是双重的。capture吃掉它作为前缀的命令的任何错误,但返回码仍然可以在_rc. 非零返回码是错误码。

一个相关的命令是confirm,例如

capture confirm var var1 

检查变量是否var1存在。

于 2013-06-02T16:05:36.343 回答
1

nostop您还可以通过在调用中添加选项来阻止 do 文件的执行在发生错误时停止:

do myfile, nostop

于 2018-05-03T08:42:02.363 回答
0

一种方法是简单地将代码插入命令行。注意:你需要先准备好,然后复制粘贴到命令行中。假设您有两个变量var1&& var2,并且var1您的第一个文件不存在,那么:

选项 1.您的.do文件是:

su var1
su var2
...

当您尝试执行它时,您会得到以下信息: variable var1 is not found//这就是所有代码停止

选项 2。您可以将同一行复制粘贴到命令字段中:

su var1
su var2
...

结果是:

. variable var1 is not found
. sum var2

    Variable |       Obs        Mean    Std. Dev.       Min        Max
-------------+--------------------------------------------------------
       var2 |     5              39     26             1         8

. 
于 2013-06-02T16:05:00.357 回答