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

Stata:检查是否有任何变量遵循命名模式,stata,Stata,我将按照模式tmp.*创建几个临时变量,然后删除它们。我想我会很聪明,做 ds tmp_* assert ": word 1 of `r(varlist)'" == "" ** then I create and do stuff with tmp_bah and tmp_blah drop tmp_* 也就是说,我想执行一个初步检查,以确保我的最后一步不会损坏先前存在的变量,比如tmp\u thing\u我忘记了 毫不奇怪,斯塔塔并没有这样做。设计者认为我的ds tmp.*是一个错误,因

我将按照模式
tmp.*
创建几个临时变量,然后
删除它们。我想我会很聪明,做

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

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

drop tmp_*
也就是说,我想执行一个初步检查,以确保我的最后一步不会损坏先前存在的变量,比如
tmp\u thing\u我忘记了

毫不奇怪,斯塔塔并没有这样做。设计者认为我的
ds tmp.*
是一个错误,因为它返回一个空结果。我看到,
ds
有几个选项,但没有一个选项能让它像在变量名列表上的普通搜索一样(搜索失败时不会发出呜呜声)


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

我不确定我是否完全理解您想要做什么,但我认为您可以使用
tempvar
s。一个愚蠢的例子:

clear 
set more off

sysuse auto
keep foreign

tempvar temp1

gen `temp1' = foreign - 100
gen usestemp = `temp1'^2
tempvar
将为临时变量获取一个安全名称,并将其放入
local temp1
(在我的示例中)。按你的意愿使用它,在程序完成后,斯塔塔负责删除它

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

请参阅帮助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

我仍然觉得引号有点混乱,所以当我不得不使用它们时,我会非常仔细地检查;只是为了确保表达式的计算结果与预期相符。

我不确定是否完全理解您想要做什么,但我认为您可以使用
tempvar
s。一个愚蠢的例子:

clear 
set more off

sysuse auto
keep foreign

tempvar temp1

gen `temp1' = foreign - 100
gen usestemp = `temp1'^2
tempvar
将为临时变量获取一个安全名称,并将其放入
local temp1
(在我的示例中)。按你的意愿使用它,在程序完成后,斯塔塔负责删除它

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

请参阅帮助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

我仍然觉得引号有点混乱,所以当我不得不使用它们时,我会非常仔细地检查;只是为了确保表达式的计算结果与预期相符。

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

 capture ds tmp_* 
并有条件地处理错误代码。但我不会那样做

首先,
confirm
的目的是确认某个东西是否存在。那更直接

其次,可以尝试
生成一个新变量,但要明确的是,如果存在,这将产生一个错误

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


编辑:
ds
在其历史中已从一个最初用于非常简洁地显示变量名的命令演变为一个其主要作用是查找由某些标准定义的变量名(例如为字符串或具有值标签或日期格式):
findname
(Stata Journal/SSC)本质上是对ds的进一步推广,使其更加明确。请注意,如果指定的名称未被使用,那么简单的
descripe
将返回
r(111)
,这是一个有用的进一步直接测试

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

 capture ds tmp_* 
并有条件地处理错误代码。但我不会那样做

首先,
confirm
的目的是确认某个东西是否存在。那更直接

其次,可以尝试
生成一个新变量,但要明确的是,如果存在,这将产生一个错误

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


编辑:
ds
在其历史中已从一个最初用于非常简洁地显示变量名的命令演变为一个其主要作用是查找由某些标准定义的变量名(例如为字符串或具有值标签或日期格式):
findname
(Stata Journal/SSC)本质上是对ds的进一步推广,使其更加明确。请注意,如果指定的名称未被使用,那么简单的
descripe
将返回
r(111)
,这是一个有用的进一步直接测试

另请参见
help capture
。作为旁注,您的
assert
语句可能不会检查您想要的内容。我在回答中包含了一些说明的代码。另请参见
help capture
。作为旁注,您的
assert
语句可能不会检查您想要的内容。我在回答中加入了一些代码。尼克,谢谢你提供更广阔的视角。问题不是
generate
,而是我想
稍后删除tmp而不捕获任何额外的内容(就像我忘记的具有相同前缀的其他变量)。我会接受罗伯托的答案,因为它解决了潜在的问题。也许我应该换个题目,不过……不知道。谢谢你更广阔的视角,尼克。问题不是
generate
,而是我想
dro