【问题标题】:Looping over variables with wildcards in local macros在本地宏中使用通配符循环变量
【发布时间】:2016-11-11 05:20:47
【问题描述】:

假设我有一个具有以下名称的变量数据集(注意 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 上的以下线程很有用,但它们没有提供解决方案,并且使用存根似乎效率不高:

谁能帮助我?

【问题讨论】:

    标签: loops stata stata-macros


    【解决方案1】:
    foreach x of varlist x* h* {
       replace `x'= . if `x' < 0
    }
    

    从这里:

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

    【讨论】:

      【解决方案2】:

      @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,至少阅读用户指南的前半部分是无可替代的。

      【讨论】:

      • 在我的代码中实际上解决了对本地宏问题的引用,但我不确定如何在 SO 中使用正确的引号,因为内联代码是使用 ` 声明的。我试图了解如何使用语法来做到这一点以提高可读性。我更喜欢使用本地宏将变量移到自己的行中,脱离循环代码。简单地在循环的左括号之前声明通配符会使阅读变得困难。我知道 var 的序列在 Stata 中称为范围,但这也可以引用 var 的值。
      • 我(我们)只能继续我(我们)在这里阅读的内容,并且不知道您的计算机上有什么不同和正确。同意:这里的标记意味着您需要转义文字反引号,或者,就像我的回答一样,只需将代码缩进即可。我认为您并不完全理解宏,因为您的 foreach ... local `myvars' 中的引号与您想要的完全错误。否则,此评论是一种品味声明,我怀疑任何有经验的 Stata 程序员都会分享你的品味。除了在这里给你一个非常间接的解决方案之外,syntax 没有任何意义。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-17
      相关资源
      最近更新 更多