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

时间:2016-11-11 05:20:48

标签: loops stata stata-macros

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

x9, xdog, x_99, hma8j, hm40, hm0

我想开发一种编程方式来提供变量名称列表(可能包含通配符),然后将每个变量名称循环到recode所有小于0的值,并且缺少值{{1} })。

在实践中,我有很多列,只想要.一些。我不想使用列索引或范围,因为我不知道它们,因为我的数据很大。

我的方法涉及以下步骤:

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

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

    local myvars x* hm*
    
  3. 循环遍历变量名称列表,将值设置为缺失:

    syntax 'myvars'
    
  4. 但是,我无法弄清楚如何在foreach x of local 'myvars' { replace 'x' = . if 'x' < 0 } 循环中包含通配符。 上面的代码不起作用并产生for错误。

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

    任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:2)

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

从这里开始:

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

答案 1 :(得分:1)

@ 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,至少在用户指南的前半部分没有真正的替代品。