【问题标题】:Join string variables in pairs of two using loops in Stata在Stata中使用循环将字符串变量成对连接起来
【发布时间】:2015-07-02 11:03:32
【问题描述】:

我有许多字符串变量v1 v2 ... v10,每个都包含一个字母。我想做的是加入v1v2v3v4 等等,直到v9v10。对于单一案例,代码很简单v12 = v1 + v2。问题是当我想对数据集中的所有对执行此操作时。我尝试了以下代码,但得到了错误的结果。

forval i=1(2)9 {
    gen var`i' = v`i' + v`i+1'
}

这是我想要的一个例子:

v1  v2 v12 
G   G  GG
A   G  AG
G   G  GG
A   A  AG

我得到了什么:

    v1  v2 v12 
    G   G  GG
    A   G  AA
    G   G  GG
    A   A  AA

由于某种原因,它两次使用同一个变量 (v1)。

【问题讨论】:

    标签: string for-loop stata


    【解决方案1】:

    您不能以这种方式对局部宏进行算术运算,即使是那些包含数字的宏。奇怪的是,Stata 只是忽略了宏引用中额外的 +1,如下例所示:

    . local i = 1
    
    . di "`i+1'"
    1
    

    严格来说,i+1 不是合法的宏名称,因为 + 字符。无论如何,忽略多余的文本是 Stata 所做的。

    有多种方法可以得到你想要的。这是一个:

    forval i = 1(2)9 {
        local j = `i' + 1 
        gen var`i' = v`i' + v`j'
    }
    

    还有一个:

    forval i = 1(2)9 {
        gen var`i' = v`i' + v`=`i'+1'
    }
    

    额外的符号

    `=  ' 
    

    表示计算给定的表达式,然后插入结果。它在精神上与您所尝试的很接近。

    【讨论】:

      【解决方案2】:

      试试这个。

      clear
      input str1 (v1 v2 v3) 
      G   G  Q 
      A   G  R
      G   G  S 
      A   A  T 
      end
      forval i=1/2{
          gen var`i'=v`i'+v`=`i'+1'
          }
      list, clean
      

      这是输出。

             v1   v2   v3   var1   var2  
        1.    G    G    Q     GG     GQ  
        2.    A    G    R     AG     GR  
        3.    G    G    S     GG     GS  
        4.    A    A    T     AA     AT  
      

      您将需要forval i=1/9。用于将 1 加到宏 i 内联的语法 `=`i'+1' 在 help macro 中称为扩展运算符。

      【讨论】:

        【解决方案3】:

        这有点奇怪

        . local i 4
        
        . dis "`i+1'"
        4
        

        这可能是因为宏扩展永远不会引发错误。

        无论如何,有一些宏扩展运算符可用于增加或减少宏(请参阅help macro)。

        clear
        input str1 (v1 v2 v3) 
        G   G  Q 
        A   G  R
        G   G  S 
        A   A  T 
        end
        
        local i = 1
        while `i' < 3 {
         gen var`i' = v`i' + v`++i'
        }
        list, clean
        

        您甚至可以使用循环计数器:

        clear
        input str1 (v1 v2 v3) 
        G   G  Q 
        A   G  R
        G   G  S 
        A   A  T 
        end
        
        forval i=1/2{
            gen var`i' = v`i++' + v`i--'
        }
        list, clean
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-01-02
          • 2016-06-26
          • 2011-05-13
          相关资源
          最近更新 更多