假设我有变量具有下列名称的数据集(注意x
和hm
存根):循环执行变量与当地的宏通配符
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
对本地宏问题的引用实际上是在我的代码中解决的,但我不确定如何在SO中使用正确的引号,因为使用''声明了内联代码。 我想了解如何做到这一点与可读性的语法。我宁愿使用本地宏将变量移到自己的行中,而不是循环代码。在循环的左括号之前简单地声明通配符使其难以阅读。我知道Stata中的变量序列称为范围,但也可以指变量的值。 – QuestionAnswer
我(我们)只能继续我(我们)在这里阅读的内容,并且不知道计算机上的内容有何不同和正确。同意:这里的标记意味着你需要转义文字反引号,或者如我的回答,只是给代码缩进。我不认为你完全理解宏,因为你的'foreach ... local \'myvars''中的引号对于你想要的是非常错误的。否则,这个评论就是口味的宣言,我怀疑任何有经验的Stata程序员都会分享你的品味。除了给你一个非常间接的解决方案外,没有什么意义可以用'syntax'来做任何事情。 –