2016-11-11 39 views
0

假设我有变量具有下列名称的数据集(注意xhm存根):循环执行变量与当地的宏通配符

x9, xdog, x_99, hma8j, hm40, hm0 

我想开发一个编程的方式来提供列表变量名称(可能包含通配符),然后遍历每个变量名称以重新编码小于0的所有值(.)。在实践中,我有很多列,只想重新编码一些列。我不想使用列索引或范围,因为我不知道它们,因为我的数据很大。我的方法:

创建一个包含通配符

local myvars x* hm* 

变量名称展开变量列表中的字符串包含完整的变量名字符串名为myvars本地宏(应出示原件变量名)

syntax 'myvars' 

遍历变量名,失踪的一组值列表..

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

上述代码无效并产生“无效语法”警告。谁能帮我?我无法弄清楚如何在循环中包含通配符。

当我发现下面是有用的,他们不提供解决方案和使用存根似乎并不高效:

http://www.stata.com/statalist/archive/2008-06/msg01060.html http://www.stata.com/statalist/archive/2006-08/msg00616.html

回答

1

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

看来,你正在在几个层次上困惑:

如何引用本地宏

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

. local foo = 42 

. di `foo' 
42 

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

syntax会这样做,但由于foreach会直接做到,syntax对于您的问题是多余的。但即使如此,您的示例在几个方面也是十分错误的。由于它的使用是不必要的,我不会在这方面扩大。

宏名称及其内容

foreach x of local `myvars' { 

(注意纠正标点)之间的区别是几乎从来没有你所需要的。它通常是

foreach x of local myvars { 

柱思

塔塔不是一个电子表格程序。列可以是你的私人词,并且没有损害,但列索引不直接支持。

如何找到答案

你是(我猜的)谷歌搜索答案,不尝试读取Stata的文档。后者有很多,初学者很难知道去哪里看,但foreach的基本帮助和相关解释比您引用的帖子更有效。他们都很好(原来我写的都是......),但离你的问题有一段距离,你也没有在你的问题中找到答案也就不足为奇了。如果你想掌握基本的Stata,至少阅读“用户指南”的前半部分是不可替代的。

+0

对本地宏问题的引用实际上是在我的代码中解决的,但我不确定如何在SO中使用正确的引号,因为使用''声明了内联代码。 我想了解如何做到这一点与可读性的语法。我宁愿使用本地宏将变量移到自己的行中,而不是循环代码。在循环的左括号之前简单地声明通配符使其难以阅读。我知道Stata中的变量序列称为范围,但也可以指变量的值。 – QuestionAnswer

+0

我(我们)只能继续我(我们)在这里阅读的内容,并且不知道计算机上的内容有何不同和正确。同意:这里的标记意味着你需要转义文字反引号,或者如我的回答,只是给代码缩进。我不认为你完全理解宏,因为你的'foreach ... local \'myvars''中的引号对于你想要的是非常错误的。否则,这个评论就是口味的宣言,我怀疑任何有经验的Stata程序员都会分享你的品味。除了给你一个非常间接的解决方案外,没有什么意义可以用'syntax'来做任何事情。 –