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

Loops 在本地宏中使用通配符在变量上循环,loops,stata,stata-macros,Loops,Stata,Stata Macros,假设我有一个具有以下名称的变量数据集,注意x和hm的存根: 我想开发一种编程方式,提供一个可能包含通配符的变量名列表,然后循环遍历每个变量名,用缺少的值重新编码所有小于0的值 实际上,我有很多列,只想对其中的一些列重新编码。我不想使用列索引或范围,因为我不知道它们,因为我的数据很大 我的方法包括以下步骤: 创建一个名为myvars的本地宏,其中包含带有通配符的变量名 local myvars x* hm* 展开变量列表中的字符串以包含完整的变量名字符串。这将生成原始变量名: syntax 'm

假设我有一个具有以下名称的变量数据集,注意x和hm的存根:

我想开发一种编程方式,提供一个可能包含通配符的变量名列表,然后循环遍历每个变量名,用缺少的值重新编码所有小于0的值

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

我的方法包括以下步骤:

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

local myvars x* hm*
展开变量列表中的字符串以包含完整的变量名字符串。这将生成原始变量名:

syntax 'myvars'
循环遍历变量名列表,将值设置为“缺少”:

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

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

有人能帮我吗

foreach x of varlist x* h* {
   replace `x'= . if `x' < 0
}
从这里开始:

从这里开始:


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

您似乎在几个层面上感到困惑:

如何引用本地宏

使用左单引号和右单引号,而不是重复右单引号:

. local foo = 42

. di `foo'
42
如何最好地解压通配符变量列表

语法可以做到这一点,但由于foreach将直接做到这一点,语法对于您的问题来说是多余的。但即使如此,您的语法示例在几个方面还是相当错误的。由于它的使用是不必要的,我将不在此详述

宏名称及其内容之间的差异

请注意,更正后的标点符号几乎从来都不是您需要的。通常是这样

foreach x of local myvars {
专栏思维

Stata不是一个电子表格程序。列可以是您的私有字,不会造成任何伤害,但不直接支持列索引

如何找到答案


我猜你是在用谷歌搜索答案,而不是试图阅读Stata文档。后者有很多,初学者很难知道去哪里找,但是关于foreach的基本帮助和相关解释比你引用的帖子更有效。他们都很好,结果都是我写的。。。但是你的问题离你还有一段距离,你在这两方面都没有找到答案也就不足为奇了。如果你想掌握基本的统计知识,至少阅读《用户指南》的前半部分是不可替代的

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

您似乎在几个层面上感到困惑:

如何引用本地宏

使用左单引号和右单引号,而不是重复右单引号:

. local foo = 42

. di `foo'
42
如何最好地解压通配符变量列表

语法可以做到这一点,但由于foreach将直接做到这一点,语法对于您的问题来说是多余的。但即使如此,您的语法示例在几个方面还是相当错误的。由于它的使用是不必要的,我将不在此详述

宏名称及其内容之间的差异

请注意,更正后的标点符号几乎从来都不是您需要的。通常是这样

foreach x of local myvars {
专栏思维

Stata不是一个电子表格程序。列可以是您的私有字,不会造成任何伤害,但不直接支持列索引

如何找到答案


我猜你是在用谷歌搜索答案,而不是试图阅读Stata文档。后者有很多,初学者很难知道去哪里找,但是关于foreach的基本帮助和相关解释比你引用的帖子更有效。他们都很好,结果都是我写的。。。但是你的问题离你还有一段距离,你在这两方面都没有找到答案也就不足为奇了。如果你想掌握基本的统计知识,至少阅读《用户指南》的前半部分是不可替代的

对本地宏的引用问题实际上在我的代码中得到了解决,但我不确定如何在SO中使用正确的引号,因为内联代码是使用``声明的。我试图理解如何通过语法来实现可读性。我更喜欢使用本地宏将变量移动到它们自己的行,即循环外代码。简单地在循环左括号之前声明通配符会使读取变得困难。我知道变量序列在Stata中称为ranges,但这也可以指变量的值。我只能继续我在这里读到的内容,不知道在你的计算机上什么是不同的和正确的。同意:这里的标记意味着您需要转义字面上的反勾号,或者,如我的回答所示,只需将代码缩进即可。我认为你并不完全理解宏,因为你的foreach中的引号。。。本地“myvars”是
你想要的完全错了。否则,这个评论就是一种品味的宣示,我怀疑任何有经验的Stata程序员是否也有你的品味。除了在这里给您一个非常间接的解决方案外,语法没有任何意义。对本地宏的引用问题实际上在我的代码中得到了解决,但我不确定如何在SO中使用正确的引号,因为内联代码是使用``声明的。我试图理解如何通过语法来实现可读性。我更喜欢使用本地宏将变量移动到它们自己的行,即循环外代码。简单地在循环左括号之前声明通配符会使读取变得困难。我知道变量序列在Stata中称为ranges,但这也可以指变量的值。我只能继续我在这里读到的内容,不知道在你的计算机上什么是不同的和正确的。同意:这里的标记意味着您需要转义字面上的反勾号,或者,如我的回答所示,只需将代码缩进即可。我认为你并不完全理解宏,因为你的foreach中的引号。。。当地的“myvars”完全不符合你的要求。否则,这个评论就是一种品味的宣示,我怀疑任何有经验的Stata程序员是否也有你的品味。语法除了在这里提供一个非常间接的解决方案外,没有任何意义。