在Stata中使用循环连接两个字符串变量

时间:2015-07-02 11:03:33

标签: string for-loop stata

我有许多字符串变量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)两次。

3 个答案:

答案 0 :(得分:4)

您不能以这种方式对本地宏进行算术运算,即使是那些包含数字的宏。 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'
}

额外的符号

`=  ' 

表示评估给定的表达式,然后插入结果。它与你正在尝试的精神紧密相关。

答案 1 :(得分:1)

试试这个。

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。语法`=`i' + 1'用于向宏添加1的内联在help macro中称为扩展运算符。

答案 2 :(得分:1)

你有点奇怪

. 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
相关问题