在本地宏中使用通配符循环变量

Looping over variables with wildcards in local macros

假设我有一个具有以下名称的变量数据集(注意 xhm 的存根):

x9, xdog, x_99, hma8j, hm40, hm0

我想开发一种编程方式来提供变量名列表(可能包含通配符),然后循环遍历每个变量名以 recode 所有小于 0 且有缺失值的值(.).

实际上我有很多专栏,只想 recode 其中一些。我不想使用列索引或范围,因为我不知道它们,因为我的数据很大。

我的方法包括以下步骤:

  1. 创建一个名为 myvars 的本地宏,其中包含带通配符的变量名

    local myvars x* hm*
    
  2. 展开变量列表中的字符串以包含完整的变量名称字符串(这应该会产生原始变量名称):

    syntax 'myvars'
    
  3. 遍历变量名称列表以将值设置为缺失值:

    foreach x of local 'myvars' { 
        replace 'x' = . if 'x' < 0
    }
    

但是,我不知道如何在 for 循环中包含通配符。 上面的代码不起作用并产生 invalid syntax 错误。

我发现 Statalist 上的以下线程很有用,但它们没有提供解决方案,而且存根的使用似乎效率不高:

谁能帮帮我?

foreach x of varlist x* h* {
   replace `x'= . if `x' < 0
}

从这里开始:

http://www.cpc.unc.edu/research/tools/data_analysis/statatutorial/labor_saving/loops

@timat 的回答给出了一个很好的基本解决方案,但没有解释你做错了什么。

看来您在几个层面上感到困惑:

如何引用本地宏

使用左右单引号,不重复(右)单引号:

. local foo = 42

. di `foo'
42

如何最好地解压通配符变量列表

syntax 会执行此操作,但由于 foreach 会直接执行此操作,因此 syntax 对于您的问题来说是多余的。但即便如此,您的 syntax 示例在几个方面还是错误的。由于它的使用是不必要的,因此我不会对此进行扩展。

宏名称与其内容的区别

foreach x of local `myvars' {

(注意更正的标点符号)几乎从来不是你需要的。通常是

foreach x of local myvars {

专栏思考

Stata 不是电子表格程序。列可以是你的私人词,并没有什么坏处,但不直接支持列索引。

如何找到答案

你(我猜)正在谷歌搜索答案,而不是试图阅读 Stata 文档。后者有很多,初学者很难知道去哪里找,但是 foreach 上的基本帮助和相关解释比您引用的帖子更有效。它们都很好(事实证明我都写了......)但是与你​​的问题有一定的距离并且你没有在其中找到问题的答案也就不足为奇了。如果您想掌握 Stata 的基本知识,那么至少阅读用户指南的前半部分是无可替代的。