Stata:检查是否有任何变量遵循命名模式

时间:2014-10-02 19:35:19

标签: stata

我将在模式tmp_*之后创建几个临时变量,之后将drop(删除)它们。我以为我会很聪明并且做到......

ds tmp_*
assert ": word 1 of `r(varlist)'" == ""

** then I create and do stuff with tmp_bah and tmp_blah

drop tmp_*

也就是说,我想进行一次初步检查,以确保我的最后一步不会损坏tmp_thing_i_forgot_about之类的预先存在的变量。

不出所料,Stata没有义务。设计者认为我的ds tmp_*是一个错误,因为它返回一个空结果。我看到ds有几个选项,但它们都没有使它像变量名列表上的普通搜索一样(在搜索失败时不会抱怨)。

我希望有人可以帮我找到解决这个问题的惯用方法。

2 个答案:

答案 0 :(得分:3)

我不确定我到底知道你想做什么,但我认为你可以使用tempvar。一个愚蠢的例子:

clear 
set more off

sysuse auto
keep foreign

tempvar temp1

gen `temp1' = foreign - 100
gen usestemp = `temp1'^2

tempvar将获取临时变量的安全名称,并将其放入local temp1(在我的示例中)。按照您的意愿使用它,在程序结束后,Stata负责将其丢弃。

您可以一次创建多个:tempvar myvar1 myvar2 myvar3

help tempvar;和 [P] 宏中的详细信息。

修改

作为旁注,您的assert声明可能无法检查您想要的内容。考虑一些例子:

clear
set more off

set obs 1

gen tmp_1 = .
gen tmp_2 = .

ds tmp_*

* other versions
assert "`:word 1 of r(varlist)'" == "r(varlist)" // true
assert `:word 1 of r(varlist)' == "tmp_1 tmp_2"  // true
assert "`:word 1 of `=r(varlist)''" == "tmp_1"   // true

* your versions
assert ": word 1 of `r(varlist)'" == ": word 1 of tmp_1 tmp_2"  // true -->
assert ": word 1 of `r(varlist)'" == ""                         // ALWAYS false

我仍然觉得引用有点令人困惑,所以我必须非常小心地检查我必须使用它们;只是为了确保表达式评估它应该是什么。

答案 1 :(得分:3)

你是对的。由于ds的目的是显示变量名称,如果您指定的不是 varlist ,则会被视为错误。你可以

 capture ds tmp_* 

并有条件地处理错误代码。但我不会这样做。

首先,confirm的目的是确认某些事物是否存在。这更直接。

其次,可以尝试generate一个新变量,但要明确这会产生错误(如果存在的话)。

第三,创建新临时变量的最佳方法是使用获取新名称的tempvar机制,然后使用generate进行操作。正如@Roberto Ferrer单独解释的那样,我需要做的就是强调它是要走的路。

编辑:ds已将其历史记录从一个命令变形,该命令的初始目的是将变量名称显示得非常简洁,其主要作用是查找由某些标准定义的变量名称(例如,字符串或具有值标签或日期格式):findname Stata Journal / SSC)本质上是ds的进一步概括,使其更加明确。请注意,如果指定的名称未使用,则简单的describe将返回r(111),这是一个有用的进一步直接测试。

相关问题