【问题标题】:Relabel variables in a loop--invalid syntax?在循环中重新标记变量——语法无效?
【发布时间】:2021-11-12 17:17:22
【问题描述】:

我有一个需要重新标记的变量列表。我创建了配对的本地人和一个循环来重命名它们,如下所示:

local demo var1                             ///
var2                                        ///     
var3                                        ///
var4                                        ///
var5                                        /// 
var6

local varlabel "label 1"                    ///
"label 2"                                   ///
"label 3"                                   ///
"label 4"                                   /// 
"label 5"                                   ///
"label 6"                                       

    * Count number of variables in local
    local mydemocount: word count `demo'
    
    
    * Loop through all variables
    forval mycounter = 1/`mydemocount' {
        local myvar:     word `mycounter' of `demo'
        local myvarlabel:        word `mycounter' of `varlabel'
        
        label var `myvar' "`myvarlabel'"
        
    }   

但是,我收到“无效语法”错误。有人可以帮我找出这里的问题吗?有没有更清洁的方法来做到这一点?

【问题讨论】:

    标签: loops label stata


    【解决方案1】:

    要测试此代码,需要一个包含相关变量的沙盒数据集。否则主要的错误是需要使用复合双引号。如果没有复合双引号,最外面的双引号会在定义 varlabel 时被剥离,这不是您想要的。

    * sandbox 
    clear
    set obs 1 
    forval j = 1/6 { 
        gen var`j' = 42 
    } 
    
    * fixed code 
    local demo var1 var2 var3 var4 var5 var6
    local varlabel `" "label 1"  "label 2" "label 3" "label 4" "label 5" "label 6" "'    
    
    * Count number of variables in local
    local mydemocount: word count `demo'
        
    * Loop through all variables
    forval mycounter = 1/`mydemocount' {
        local myvar: word `mycounter' of `demo'
        local myvarlabel: word `mycounter' of `varlabel'   
        label var `myvar' "`myvarlabel'"
    }    
    

    这个例子自然可以代表一个更复杂的例子,但即便如此,用一个语句定义每个变量标签要简单得多。代码将所有变量名放入一个本地,将所有变量标签放入另一个本地——然后代码必须再次将它们取出。这就像把几只左手套放在一个盒子里,把几只右手套放在另一个盒子里,然后把它们从盒子里拿出来配对。不需要装箱和拆箱。

    循环很棒,但在拼出单个语句更容易的情况下就不行了。

    具体来说,这是一个迂回的方式,执行其中的6条语句

    label var var1 "label 1" 
    

    具有代表性。

    另一方面,如果我们从字面上理解这个问题,那可能是一个循环:

    forval j = 1/6 { 
        label var var`j' "label `j'" 
    } 
    

    但我的猜测是你并不真正想要这样,就像在可能唤起名字的时候使用像 var1 这样的名字是一个糟糕的选择。抽象问题有时会掩盖真正的问题。

    【讨论】:

      猜你喜欢
      • 2016-05-29
      • 2017-05-02
      • 2016-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-16
      • 1970-01-01
      相关资源
      最近更新 更多